繁体   English   中英

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

[英]MySQL - Left join … on … LIKE

我有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列包含连接的skill_id。

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

能不能请你开导。

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

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

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

目前,您可以使用串联来使用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,',%')
        );

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM