mysql - 在 MySQL : selecting publications on keyword but including all keywords in results

标签 mysql sql

发布表如下所示:

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/

相关文章:

php - 获取下拉选择以将用户定向到新页面(MySQL && P4A 应用程序框架)

mysql - Sonar : local or external MySQL database?

MySQL查询排序两列,一个ASC另一个DESC

sql将2列的输出合并为一列

mysql - 如何将文本格式的日期数据类型更改为日期时间格式

mysql - 在行中执行更新规则

mysql - LEFT 联合聚合中的 SQL 计数?

php - 建议SQL查询

MySQL全文查询返回错误,索引已创建

java - 如何处理源代码中的巨大 SQL 字符串