获取喜欢和评论的帖子 - 一个查询?

时间:2013-05-30 11:07:20

标签: php mysql sql

我即将为用户个人资料开发一个墙。它基本上与Facebook评论/喜欢系统的工作方式相同。

所以我想要做的是获取与用户个人资料相关的所有墙贴(通过当前的id变量)以及与此特定帖子相关的所有评论和喜欢。我想使用来自评论和喜欢的用户数据(即:姓名,user_id,电子邮件等)。

所以问题是:有可能吗?

根据这个帖子的答案,它不是:Fetch all news and all comments

根据这个帖子,它是:mysql/php: show posts and for each post all comments

我尝试使用此代码,但它似乎不起作用,因为它只是从数据库中提取所有注释。

SELECT p.*, c.*, l.*, u.name as post_author, u2.name as comment_author, u3.user_id
FROM edu_wall p
LEFT JOIN edu_comments c ON c.comment_entity = p.post_id
LEFT JOIN edu_likes l ON l.like_entity = p.post_id
LEFT JOIN edu_users u ON u.user_id = p.post_author
LEFT JOIN edu_users u2 ON u2.user_id = c.comment_author
LEFT JOIN edu_users u3 ON u3.user_id = l.like_author

那么解决方案是什么?我应该通过获取所有墙贴,然后在while()内部启动,循环评论和喜欢?它看起来像是一个非常复杂且资源密集的解决方案。

提前致谢!

2 个答案:

答案 0 :(得分:0)

您可以使用union例如:

SELECT id, p.name, NULL as "type", u1.username 
FROM edu_wall p 
LEFT JOIN users u1 ON u.id = p.user_id
UNION
SELECT id, NULL as 'name', e.type, u2.username 
FROM edu_likes e 
LEFT JOIN users u2 ON u.id = e.user_id

Null是替换表之间的额外列,所以这里当type为NULL时,infos用于edu_wall用户,当它注意到它们是edu_likes用户时。

你应该试着看看自己

答案 1 :(得分:0)

这在单个查询中肯定是可能的。

在不知道您的表格布局和您想要使用的字段的情况下,我现在无法提供任何建议的代码。

然而问题是,一个墙上的帖子会有很多评论和众多喜欢。您当前的SQL会为每个墙贴上的每个评论组合带回一行。因此,如果一个墙贴有2个评论和2个喜欢,那将导致4行。

你可以通过几种方式解决这个问题。要么确保在SELECT上有一个order子句,然后在php处理每一行手动,并确定评论或类似是否是该墙贴的新内容。如果这样处理它,如果不理会它。

或者,您可以使用聚合函数(例如GROUP_CONCAT)在一行中恢复所需的字段。然后在php中爆炸它们。 Sql是这样的: -

SELECT p.*, u.name as post_author, GROUP_CONCAT(u2.name SEPARATOR '#') as comment_authors, GROUP_CONCAT(u3.user_id SEPARATOR '#') as post_likers
FROM edu_wall p
LEFT JOIN edu_comments c ON c.comment_entity = p.post_id
LEFT JOIN edu_likes l ON l.like_entity = p.post_id
LEFT JOIN edu_users u ON u.user_id = p.post_author
LEFT JOIN edu_users u2 ON u2.user_id = c.comment_author
LEFT JOIN edu_users u3 ON u3.user_id = l.like_author
WHERE p.id = $SomeWallId
GROUP BY p.id