我有 4 张 table 可供聊天。
Table-1(主要评论表,Table-1的用户是从Table-2考虑的)
<小时/>ID
评论
<小时/>表 2(当表 1 中添加新评论时,表 2 也会使用评论者的 user_id 进行更新)
<小时/>comment_id(引用表1)
用户 ID
<小时/>Table-3(做了一些其他工作,但通过 comment_id 与 Table-1 相关)
<小时/>ID
与表3相关的列
comment_id
用户 ID
<小时/>table-4(做了一些其他工作,但通过 comment_id 与 Table-1 相关)
<小时/>ID
与表4相关的列
comment_id
用户 ID
<小时/>现在我想从所有表(表 2、表 3、表 4)中获取 comment_id,最后如果特定用户出现在任一表中,则使用表 1 中的这些 comment_id 获取评论。
SELECT A.id,A.comment,
FROM Table-1 A
LEFT JOIN Table-2 B
ON B.comment_id = A.id
LEFT JOIN Table-3 C
ON C.comment_id = A.id OR C.user_id = {$current_user}
LEFT JOIN Table-4 D
ON D.comment_id = A.id OR D.user_id = {$current_user}
WHERE B.`user` = {$current_user}
GROUP BY A.`id`
ORDER BY A.`id` DESC
LIMIT 7 OFFSET 0
我也尝试了 3 个表的并集
Select A.id AS cid
FROM Table-1 A
LEFT JOIN Table-2 B
ON B.comment_id = A.id
WHERE B.user_id = {$current_user}
UNION
Select C.comment_id AS cid
FROM Table-3 C
WHERE C.user_id = {$current_user}
UNION
Select D.comment_id AS cid
FROM Table-4 D
WHERE D.user_id = {$current_user}
但是这里我不知道如何获取“GROUP BY A.id
, ORDER BY A.id
DESC
LIMIT 7 OFFSET 0"正在工作,但不知道如何使用我从 union 获得的 id 从 Table-1 中获取注释。
表1(事件) 表2(评论) Table-2(评论)id 作为 data-id 连接到 table-1(事件)。 我在表 1 中链接表 2(以了解时间和评论用户等)。
表3(聊天) 这里的概念就像一个评论可以有由聊天代表的线程。它总是与评论相关。
表4(chat_followers) 在这里,您可以 ping 到其他用户,这样在聊天中 ping 到的所有用户都会在这里
最后,我们的想法是获取“用户的所有评论”,如果他写了该评论或在聊天中回复(评论的线程)或者如果他被其他任何人 ping 到。
最佳答案
既然您不需要表 2、3、4 中的评论 ID 以外的任何数据,为什么不使用简单的 IN 子句呢?
SELECT *
FROM Table1 A
WHERE A.id IN
(SELECT Comment_Id FROM Table2 WHERE.... UNION ALL
SELECT Comment_ID FROM Table3 WHERE... UNION ALL
SELECT Comment_Id FROM Table4 WHERE...)
GROUP BY A.`id`
ORDER BY A.`id` DESC
LIMIT 7 OFFSET 0
如果您确实想使用其他表中的附加列,则可以使用 LEFT OUTER JOIN 来实现:
SELECT A.id,A.comment
FROM
Table-1 A LEFT JOIN
Table-2 B ON B.comment_id = A.id AND B.User = currentUserId LEFT JOIN
Table-3 C ON C.comment_id = A.id AND C.User = currentUserId LEFT JOIN
Table-4 D ON D.comment_id = A.id AND D.User = currentUserId
WHERE B.id IS NOT NULL OR C.id IS NOT NULL OR D.id IS NOT NULL
GROUP BY A.`id`
ORDER BY A.`id` DESC
LIMIT 7 OFFSET 0
关于mysql - 使用if条件或CASE连接4个表的Sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55636616/