1

我即将为用户配置文件开发一堵墙。它的工作方式基本上与 Facebook 的评论/点赞系统相同。

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

所以问题是:有可能吗?

根据这个线程的回答,它不是:获取所有新闻和所有评论

根据这个线程它是:mysql/php:显示帖子和每个帖子的所有评论

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

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() 中循环评论和喜欢吗?这似乎是一个非常复杂且资源密集型的解决方案。

提前致谢!

4

2 回答 2

1

例如,您可以使用联合:

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 时,信息是针对 edu_wall 用户的,当注意它们是针对 edu_likes 用户的。

你应该试着看看你自己

于 2013-05-30T11:14:57.347 回答
0

这在单个查询中当然是可能的。

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

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

你可以通过几种方式来解决这个问题。确保您在 SELECT 上有一个 order 子句,然后在 php 中手动处理每一行并确定评论或喜欢是否是该墙帖的新评论。如果是这样处理它,如果不是忽略它。

或者,您可以使用聚合函数,例如 GROUP_CONCAT,将您想要的字段带回一行。然后在 php.ini 中分解它们。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
于 2013-05-30T11:59:53.013 回答