【问题标题】:Get Posts with likes and comments - one query?获取带有喜欢和评论的帖子 - 一个查询?
【发布时间】:2013-05-25 22:24:19
【问题描述】:

我即将为用户资料制作一面墙。它与 Facebook 的评论/点赞系统基本相同。

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

所以问题是:有可能吗?

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

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

我已尝试使用此代码,但它似乎不起作用,因为它只是从 DB 中获取所有 cmets。

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

提前致谢!

【问题讨论】:

  • 执行至少 2 个查询是有意义的:1 个用于获取帖子,另一个用于获取 cmets。也许第三个获得喜欢。否则你会陷入无法有效解决的制作地狱
  • 你能发布表格布局吗?
  • 如果我猜对了,你的数据库模式是什么样子的,查询应该没问题。提供一组示例记录,告诉我们您期望从查询中得到什么以及您实际得到什么。
  • 但是作为初始注释,您的 SQL 没有在任何地方指定用户 ID,因此将获取所有墙壁,然后是这些墙壁的所有 cmets。为了提高效率,进行查询并围绕结果进行循环以进行进一步查询往往效率低下(尽管有时是唯一的选择)。

标签: php mysql sql


【解决方案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 用户的。

你应该试着看看自己

【讨论】:

  • 你真的认为wall实体与likes具有相同的属性吗?
  • 在处理结果集时如何获取哪些行来自哪个表?
  • 我知道,OP - 不知道。放置它们后,请回答它到底比 2 个单独的查询更好。
  • 不,这行不通。列名取自第一个查询。
  • 嗯,常见的解决方案是SELECT 'from first' AS label, ...
【解决方案2】:

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

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

但问题是,单个墙帖将有许多 cmets 和许多喜欢。您当前的 SQL 将为每个墙贴的评论和喜欢的每个组合带回一行。因此,如果一个墙帖有 2 个 cmets 和 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多