如何用连接修复sql语句?

时间:2014-12-20 05:05:29

标签: mysql join

在我的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

1 个答案:

答案 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上左键连接。