首页 > 解决方案 > 从多个表中获取 ID

问题描述

一个论坛有这 5 个表(更多,但这 5 个对查询很重要):

我正在尝试获取用户发布、观看或收藏主题的 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 或书签的条目。

任何想法我做错了什么?非常感谢您的宝贵时间。

标签: mysqlsql

解决方案


你没有聚合功能所以你不需要组

如果您需要不同的结果,请添加 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

推荐阅读