2

出版物表如下所示:

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 行,我会得到一个列表,其中“关键字”列包含该结果的所有可用关键字。

我如何既可以选择关键字,又可以在结果中包含所有关键字?

4

1 回答 1

0

使用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是将连接条件放在表引用旁边,而不是放在查询的最下方。
于 2018-05-11T10:35:52.507 回答