mysql - 从多个表中获取 ID
问题描述
一个论坛有这 5 个表(更多,但这 5 个对查询很重要):
- 帖子
- 话题
- topic_watch
- 书签
- 主题忽略
我正在尝试获取用户发布、观看或收藏主题的 topic_id(分组),并处理被忽略的主题。简而言之:
我想要一个按时间排序的 ID 列表,而不关心它们来自哪个表。
我构建了这个 SQL QUERY:
SELECT t.topic_id
FROM posts p
LEFT
JOIN topics t
ON p.topic_id = t.topic_id
LEFT
JOIN topics_watch w
ON w.user_id = p.poster_id
AND w.topic_id = t.topic_id
LEFT
JOIN bookmarks b
ON b.user_id = p.poster_id
AND b.topic_id = t.topic_id
LEFT
JOIN topics_ignore i
ON i.user_id = p.poster_id
AND i.topic_id = t.topic_id
WHERE p.poster_id = 109606
AND i.topic_id IS NULL
AND t.topic_last_post_time > 1610274162
GROUP
BY t.topic_id
ORDER
BY t.topic_last_post_time DESC
问题:
该查询正在运行,但不处理topic_watch和 bookmarks 表。这意味着,如果用户已经观看或收藏了一个主题,则 topic_id 不会出现在列表中。忽略的作品。
更多信息:
主题表包含有关该主题的所有信息。书签和 topic_watch 表只有两列。用户 ID,主题 ID。我正在尝试获取用户在(帖子)中发布的所有 topic_id 的列表,其中包含 topic_watch 或书签的条目。
任何想法我做错了什么?非常感谢您的宝贵时间。
解决方案
你没有聚合功能所以你不需要组
如果您需要不同的结果,请添加 dictinct 子句
SELECT DICTINCT t.topic_id, w.topic_id, b.topic_id
FROM posts p
LEFT JOIN topics t ON p.topic_id = t.topic_id
LEFT JOIN topics_watch w ON w.user_id = 109606 AND w.topic_id = t.topic_id
LEFT JOIN bookmarks b ON b.user_id = 109606 AND b.topic_id = t.topic_id
LEFT JOIN topics_ignore i ON i.user_id = 109606 AND i.topic_id = t.topic_id
WHERE p.poster_id = 109606
AND i.topic_id IS NULL
AND t.topic_last_post_time > 1610274162
ORDER BY t.topic_last_post_time DESC
在版本 < 5.7 中使用不带聚合函数的 group by 返回不可预测的结果,对于版本 > 5.7 产生和错误
但是,如果您需要在表之间合并行的结果,您可以使用 UNION
SELECT t.topic_id, t.topic_last_post_time
FROM posts p
INNER JOIN topics t ON p.topic_id = t.topic_id
LEFT JOIN topics_ignore i ON i.user_id = 109606 AND i.topic_id = t.topic_id
WHERE p.poster_id = 109606
AND i.topic_id IS NULL
AND t.topic_last_post_time > 1610274162
UNION
SELECT w.topic_id, NULL
FROM topics_watch w
WHERE w.user_id = 109606
UNION
SELECT b.topic_id, NULL
FROM bookmarks b
WHERE b.user_id = 109606
ORDER BY topic_last_post_time DESC
推荐阅读
- javascript - 如何优化/加速 Vue JS 应用程序中的自动搜索?
- python - 如何在网站 selenium 上显示错误消息时打印消息
- c - 优化 C 中的 base64 编码和解码
- excel - 显示和隐藏对象
- mysql - 使用 group by 子句检索的记录总和
- javascript - 如何在 v-time-picker 中禁用选择分钟?
- excel - 具有多个条件的 2 个不同列的 Excel vlookup
- javascript - 未处理的拒绝 .every(...) 不是函数
- django - 图片上传时生成缩略图django
- ios - 如何解码包含日期信息的 JSON?