【问题标题】:MySQL - Join three tables and display data (even if no match is found)MySQL - 连接三个表并显示数据(即使没有找到匹配项)
【发布时间】:2016-10-31 15:19:17
【问题描述】:

我有一个连接 三个 表的查询:

  1. 专业 { id, name, description, image }
  2. 医生{身份证、姓名、描述、照片}
  3. doc_spec { id, id_doc, id_spec }

    SELECT
       d.id,
       d.name,
       d.description,
       d.photo,
       GROUP_CONCAT(s.name SEPARATOR ', ') AS 'specialty'
    FROM
       doc_spec ds
    INNER JOIN
       doctors d
    ON
       ds.id_doc=d.id
    INNER JOIN
       specialties s
    ON
       ds.id_spec=s.id
    GROUP BY
       d.id
    

查询可以完美地使用连接其他两个表的 doc_spec 表从两个表中检索数据,但问题是当我的医生没有具有指定专业时。

我该怎么做才能在 doc_spec 表上没有匹配项时不显示该行,而是在专业列上检索具有 NULL 值的行?如果可能,而不是显示 null,如果它可以保存类似“没有指定专业”的值,那将是完美的。

更新

我找到了一种使用 RIGHT JOIN 和 LEFT JOIN 的方法,但我不确定这是否是正确的方法,我仍然希望能够保持像“没有指定专业”这样的值而不是 null。

    SELECT
       d.id,
       d.name,
       d.description,
       d.photo,
       GROUP_CONCAT(s.name SEPARATOR ', ') AS 'specialty'
    FROM
       doc_spec ds
    RIGHT JOIN
       doctors d
    ON
       ds.id_doc=d.id
    LEFT JOIN
       specialties s
    ON
       ds.id_spec=s.id
    GROUP BY
       d.id

【问题讨论】:

  • 你试过LEFT OUTER JOIN而不是INNER JOIN吗?
  • 不能只使用 left 但如果我同时使用 rightleft 就可以使用,谢谢
  • 啊,是的,没看到你以doc_specs开头。非常好。
  • 从左到右排序你的数据,最左边是主要的,后面的所有数据都不重要。所以你只剩下左连接了。如果数据是强制性的,则进行内连接,如果是可选的,则使用外连接。看起来您的问题是,您最需要的数据不在表格排序的左上角或右上角。
  • 我明白了,@DanFromGermany。谢谢。

标签: mysql join


【解决方案1】:

我认为这应该可以解决问题:

SELECT
   d.id,
   d.name,
   d.description,
   d.photo,
   IFNULL(GROUP_CONCAT(s.name SEPARATOR ', '), 'No specialities') AS 'specialty'
FROM
   doc_spec ds
RIGHT JOIN
   doctors d
ON
   ds.id_doc=d.id
LEFT JOIN
   specialities s
ON
   ds.id_spec=s.id
GROUP BY
   d.id

【讨论】:

  • 为什么是-1?你能告诉我吗?
  • 您好,@vookash,它运行良好,正是我想要的。谢谢。至于 -1 是 not 我。
  • 很高兴能帮上忙 :)
猜你喜欢
  • 2015-04-11
  • 2021-01-18
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
相关资源
最近更新 更多