[英]PHP & Mysql - Left Outer Join between two tables
我有两个名为“事件”和“主题”的表,每个表可以有很多注释。
我需要做的是列出所有事件和主题以及每行的注释量。 我设法返回了所有主题,效果很好,但是我不知道如何将事件表添加到MySql中。 注释和事件表字段在下面列出。 有人可以帮我这个查询吗?
大事记:
评论:
table <-该行所属的表,因此主题或事件
SELECT t.id, t.title, c.created_at, IF(ISNULL(c.allComments), 0, c.allComments) AS totalComments FROM topics AS t LEFT OUTER JOIN ( SELECT created_at, post_id, COUNT(*) AS allComments FROM comments GROUP BY post_id ) AS c ON c.post_id = t.id ORDER BY tc.created_at DESC, c.allComments DESC
听起来事件和主题应该在同一张桌子上。
不过,我认为我们可以使用UNION做到这一点。 我希望事件和主题具有相同的列? (或者至少是同样重要的?)
(SELECT c.table as event_or_topic, e.*, count(C.table), MAX(C.created_at) as latest_c
FROM events E LEFT JOIN comments C on (C.post_id = E.id)
WHERE C.table = 'Events'
GROUP BY C.post_id)
UNION
(SELECT c.table as event_or_topic, t.id*, count(C.table), MAX(C.created_at) as latest_c
FROM topics T LEFT JOIN comments C on (C.post_id = E.id)
WHERE C.table = 'Topics'
GROUP BY C.post_id)
ORDER BY latest_c
注意,ORDER BY适用于整个UNION,而不适用于单个SELECT。
使用LEFT JOIN应该允许那些没有注释的行仍然显示。 我认为问题在于我们选择的部分内容依赖于注释(即-C.table,最后注释的排序等)。 计数应该可以-如果没有评论,则为零。
您可能需要稍微更改SELECT部分。 我想显示C.table,以便您知道行是主题还是事件,但恐怕它可能会增加计数。 除了计数之外,您还需要其他注释吗? 您在查询中使用了post_id和table以外的其他列,而这些列在问题中被忽略了。
您仍然有不知道它们是什么的列,例如Comment的zoneTable
尝试这个:
SELECT t.id, t.title, c.created_at, COUNT(c.allComments) AS totalComments FROM topics AS t LEFT JOIN comments c ON t.id=c.post_id GROUP BY t.id ORDER BY tc.created_at DESC, c.allComments DESC
如果我理解您的问题,那么您有3个表格:
-事件
-主题
-评论
如果是这样,则应提取所有数据:
SELECT *
FROM events,topics
LEFT JOIN comments ON post_ID = ID
ORDER BY date DESC
希望我走对了!
W.
我已经工作了。 如果有人知道更好,更有效的方法,请告诉我:
(SELECT t.id, t.title, tc.dateCreated AS commentDate,
IF(ISNULL(tc.allComments), 0, tc.allComments) AS totalComments,
t.LastActive as dateChanged
FROM Events AS t
LEFT OUTER JOIN (
SELECT MAX(created_at) AS dateCreated, post_id,
COUNT(*) AS allComments
FROM comments
GROUP BY post_id
) AS tc ON tc.post_id = t.id)
UNION
(SELECT t.id, t.title, tc.dateCreated AS commentDate,
IF(ISNULL(tc.allComments), 0, tc.allComments) AS totalComments,
t.LastActive as dateChanged
FROM topics AS t
LEFT OUTER JOIN (
SELECT MAX(created_at) AS dateCreated, post_id,
COUNT(*) AS allComments
FROM comments
GROUP BY post_id
) AS tc ON tc.post_id = t.id)
ORDER BY commentDate DESC, dateChanged DESC, totalComments DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.