繁体   English   中英

PHP和Mysql-两个表之间的左外部联接

[英]PHP & Mysql - Left Outer Join between two tables

我有两个名为“事件”和“主题”的表,每个表可以有很多注释。

我需要做的是列出所有事件和主题以及每行的注释量。 我设法返回了所有主题,效果很好,但是我不知道如何将事件表添加到MySql中。 注释和事件表字段在下面列出。 有人可以帮我这个查询吗?

大事记:

  • ID
  • 事件名称

评论:

  • post_id <-事件或主题表的相关ID
  • 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM