mysql - 使用 WHERE IN 子句检查值是否不存在 - MYSQL

标签 mysql sql

嘿,我正在写 sql 查询,我几乎完成了,但我需要更改重要的内容,但仍然不知道修复它。这是我的 SQL 示例

SELECT post.id,post.name as post_name,
(SELECT users.login FROM users WHERE post.creator = users.id) creator,
(SELECT COUNT(*) FROM recommends WHERE recommends.idea_id = post.id) recommends,
(SELECT COUNT(*) FROM comments WHERE comments.idea_id = post.id) comments,
GROUP_CONCAT(tags.tag SEPARATOR ',') as tags
FROM posts
LEFT JOIN tags
ON post.id = tags.idea_id
WHERE post.name IN
(
    SELECT post.name FROM posts
    JOIN tags   ON post.id = post.idea_id
    WHERE tags.tag IN ('X','Y','Z')
)
GROUP BY post.name

有什么问题吗?如果我们的 X 或 Y 或 Z 不存在,查询仍然有效。我不知道如何修复,我尝试了一些 NOT EXISTS 子句或 NOT IT 但它不起作用。 感谢您的帮助。

最佳答案

如果您正在寻找具有任何其中一个标签的帖子,您可以执行以下操作:

SELECT post.id, post.name as post_name,
       (SELECT users.login FROM users WHERE post.creator = users.id) as creator,
       (SELECT COUNT(*) FROM recommends WHERE recommends.idea_id = post.id) as recommends,
       (SELECT COUNT(*) FROM comments WHERE comments.idea_id = post.id) as comments,
       GROUP_CONCAT(tags.tag SEPARATOR ',') as tags
FROM posts LEFT JOIN
     tags
     ON post.id = tags.idea_id
GROUP BY post.id, post.name
HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) > 0;

注意:我更改了 GROUP BY 以包含 post.id(假设每个 id 的名称是唯一的)。最好在 GROUP BY 子句中包含所有非聚合列。如果同一个名称有多个 id,则从 SELECT 中删除 post.id

如果您想要所有三个标签没有重复项(合理的假设),则将HAVING更改为:

HAVING SUM(tags.tag IN ('X', 'Y', 'Z')) = 3;

关于mysql - 使用 WHERE IN 子句检查值是否不存在 - MYSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235896/

相关文章:

mysql - 在mySQL中将一个字段拆分为两个字段

php - 插入每个数据不同的行 PDO

sql - Postgresql 从 JSON 列中选择

mysql - 按顺序按比赛分组

php - Dockerfile Image 命令 '/bin/sh -c apt-get install -y mysqld-server' 返回非零代码 : 100

php - ajax更新mysql字段而不刷新页面

mysql - 在多个语句的锁表内使用 CASE

SQL Server Reporting Services 权限错误

sql - 从查询结果中选择随机结果样本

mysql - 选择 SQL 的邮政编码问题