MySQL - 左连接......在......喜欢

时间:2017-05-16 10:39:52

标签: mysql left-join sql-like denormalized

我有2张桌子

在桌面"用户"上,每个用户都有许多技能。它们存在于单个列中并连接在一起。 在表格"技能",每个技能都有一个相关的标签。

有些用户拥有未在表格中引用的技能"技能"了。

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

我试图做类似的事情:

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

但是,声明 ON USERS.skills = SKILLS.skill_id 不符合我的需要。 USERS.skills列包含连接的skill_id。

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

请你赐教。

2 个答案:

答案 0 :(得分:0)

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

  1. 阅读文本字符串中的技能并将其拆分并使用另一个语句来读取杀戮(使用SQL:" WHERE id in(1,2,3)")
  2. 使用链接表。您必须在第三个表中具有依赖项,表格中包含以下字段:UserId和SkillId。如果用户有3个技能,则第三个表必须有3个条目。您可以使用简单的SQL语句
  3. 选择它们

答案 1 :(得分:0)

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

目前,您可以使用串联来使用likelength以及replace来查找逗号分隔字符串中的项目数。

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,',%')
        );

Demo