【问题标题】:MySQL - Left join ... on ... LIKEMySQL - 左连接 ... on ... LIKE
【发布时间】:2017-05-16 10:39:51
【问题描述】:

我有两张桌子

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

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

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

我试图做类似的事情:

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 包含连接的技能 ID。

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

请您赐教。

【问题讨论】:

  • 这就是为什么你应该总是规范化
  • 基本上你需要规范化USERS,然后对结果进行左连接。这里介绍了规范化:stackoverflow.com/questions/17308669/…
  • 感谢您的回答。我对 MySQL 的记忆太生疏了,而且绝对不是最新的。规范化似乎确实是要走的路,这很棒!我要玩这个概念。

标签: mysql left-join sql-like denormalized


【解决方案1】:

如果不进行编程,您无法以这种方式做到这一点。 有两种可能的方法:

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

【讨论】:

    【解决方案2】:

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

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2013-11-21
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多