发布表如下所示:
publications
============
id title etc ...
关键字表如下所示:
keywords
========
id name etc ...
keywords_relations 表创建出版物和关键字之间的关系,作为外键,其中 pid 指向 publications.id,kid 指向 keywords.id。
keyword_relations
=================
pid kid
在 MySQL 中,我构造了以下查询:
SELECT publications.*,
GROUP_CONCAT(keywords.name SEPARATOR ', ') AS keywords
FROM publications
LEFT JOIN keyword_relations
INNER JOIN keywords
ON keyword_relations.kid = keywords.id
ON keyword_relations.pid = publications.id
WHERE keywords.id = 1
GROUP BY publications.id
ORDER BY publications.date DESC;
我正在选择 keywords.id 上的出版物。但是,在结果列表中的“关键字”列只返回选定的关键字。我希望“关键字”列包含由此产生的所有可用关键字。
如果我删除 WHERE 行,我会得到一个列表,其中“关键字”列包含该结果的所有可用关键字。
我怎样才能既选择关键字又在结果中包含所有关键字?
最佳答案
使用 HAVING
子句而不是 WHERE
:
SELECT p.*,
GROUP_CONCAT(k.name SEPARATOR ', ') AS keywords
FROM publications p LEFT JOIN
keyword_relations kr
ON kr.pid = p.id INNER JOIN
keywords k
ON kr.kid = k.id
GROUP BY p.id
HAVING SUM(k.id = 1) > 0
ORDER BY p.date DESC;
注意事项:
HAVING
子句计算符合条件的关键字数量。> 0
表示有一个。- 表别名使查询更易于编写和阅读。
ON
子句应该紧跟在表格之后。JOIN
语法的目的之一是将连接条件放在表引用的旁边,而不是放在查询的最下方。
关于mysql - 在 MySQL : selecting publications on keyword but including all keywords in results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289504/