在我的MySQL查询中,我尝试获取线程和每个线程,最新的注释以及另一个表中的一些图像。这有效,但有一个问题。如果帖子没有评论,那么它就不会被包括在内。我想要它,如果线程没有注释,那么它仍然应该被包含,但是注释列应该为null,image_id
也应该为null。
有谁知道我该怎么做?
由于
SELECT t.id,t.user_id,t.title,c.comment,d.has_answer,d.recent_date,MIN(i.id) image_id
FROM threads t
INNER JOIN comments c ON c.thread_id = t.id
INNER JOIN (
SELECT thread_id, MAX(date_sent) recent_date, MAX(is_answer) has_answer
FROM comments
GROUP BY thread_id
) d ON d.thread_id = c.thread_id AND d.recent_date = c.date_sent
LEFT JOIN thread_images i ON t.id = i.thread_id
GROUP BY t.id
更新
这一种方法有效,但是当没有评论时,它会使recent_date以某种方式有一个日期。在那种情况下它应该为空......
SELECT t.id,t.user_id,t.title,c.comment,d.has_answer,d.recent_date
FROM threads t
left JOIN comments c ON c.thread_id = t.id
inner JOIN (
SELECT thread_id, MAX(date_sent) recent_date, MAX(is_answer) has_answer
FROM comments
GROUP BY thread_id
) d ON c.thread_id IS NULL OR (d.thread_id = c.thread_id AND d.recent_date = c.date_sent)
GROUP BY t.id
更新2
这个似乎工作正常,但似乎很奇怪
SELECT t.id,t.user_id,t.title,c.comment,d.has_answer, IF(c.id IS NULL, NULL, d.recent_date) recent_date,MIN(i.id) image_id
FROM threads t
LEFT JOIN comments c ON c.thread_id = t.id
INNER JOIN (
SELECT thread_id, MAX(date_sent) recent_date, MAX(is_answer) has_answer
FROM comments
GROUP BY thread_id
) d ON c.id IS NULL OR (d.thread_id = c.thread_id AND d.recent_date = c.date_sent)
LEFT JOIN thread_images i ON t.id = i.thread_id
GROUP BY t.id
答案 0 :(得分:0)
这是通过左连接。
SELECT
t.id,
t.user_id,
t.title,
c.comment,
d.has_answer,
d.recent_date,
MIN(i.id) image_id
FROM
threads t
LEFT JOIN comments c
ON t.id = c.thread_id
LEFT JOIN ( SELECT
thread_id,
MAX(date_sent) recent_date,
MAX(is_answer) has_answer
FROM
comments
GROUP BY
thread_id ) d
ON c.thread_id = d.thread_id
AND c.date_sent = d.recent_date
LEFT JOIN thread_images i
ON t.id = i.thread_id
GROUP BY
t.id
然而,作为一个基于网络的系统,我强烈考虑在主线程中添加几条记录以获取最新评论,最小图像ID,答案ID,这样您就不必为MIN进行聚合(图像),max(isAnswer),max(评论日期)来获取值。相反,使用触发器。将注释添加到线程时,只需使用该ID更新线程。对于图像,如果您想要最小ID,那么如果没有先前的图像,并且添加了新的图像,则在保存第一个图像的情况下更新线程。同样建立了答案。因此,触发器在保存时完成,您不必处理更复杂的查询,您可以在table.column上左键连接。