1

我有 2 张桌子

在“用户”表中,每个用户都有许多技能。它们位于单个列上并被连接起来。在“技能”表中,每个技能都有一个关联的标签。

碰巧有些用户的技能不再在“技能”表中引用。

我想做的选择应该列出表用户上的所有记录,这些记录包含表技能中不再引用的技能。

我试图做类似的事情:

SELECT user_id 
FROM USERS LEFT JOIN SKILLS 
ON USERS.skills = SKILLS.skill_id 
WHERE SKILLS.skill_id = null

但是,关于 USERS.skills = SKILLS.skill_id的语句不符合我的需要。列 USERS.skills 包含连接的技能 ID。

我试图用ON USERS.skills LIKE SKILLS.skill_id替换那个位,但它仍然感觉不对并且查询永远运行......

能否请您赐教。

4

2 回答 2

0

如果没有编程,你不能以这种方式做到这一点。有两种可能的方式:

  1. 读取文本字符串中的技能并将其拆分并使用另一个语句来读取杀戮(使用 SQL:“WHERE id in (1,2,3)”)
  2. 使用链接表。您必须在第三个表中具有依赖关系,该表必须具有以下字段:UserId 和 SkillId。如果用户有 3 个技能,则第三个表必须有 3 个条目。你可以用一个简单的 SQL 语句来选择它们
于 2017-05-16T10:47:59.507 回答
0

理想情况下,您应该规范化架构。

现在,您可以使用串联来使用likeandlengthreplace查找逗号分隔字符串中的项目数。

select *
from users u
where length(u.skills) - length(replace(u.skills, ',', '')) + 1 <> (
        select count(*)
        from skills s
        where concat (', ',u.skills,',') like concat ('%, ',s.skill_id,',%')
        );

演示

于 2017-05-16T10:48:52.003 回答