【问题标题】:MySQL grabbing all posts by a user and all the likes for each post (joining, grouping, counting, etc.)MySQL 抓取用户的所有帖子以及每个帖子的所有喜欢(加入、分组、计数等)
【发布时间】:2012-02-03 02:42:34
【问题描述】:

我正在构建一个论坛软件,并试图通过特定的“个人资料”抓取所有帖子,抓取所有“喜欢”每个帖子的个人资料(“喜欢的人”),然后第三次获取喜欢每个帖子的每个个人资料的个人资料数据(profile_name 等)。

Table 1 - posts
---------------
post_id
profile_id (original poster)
content
...

Table 2 - like
--------------
profile_id
post_id

Table 3 - profiles
------------------
profile_id
profile_name
...

一些规则:

  • 每个赞只是post_idprofile_id 的关系
  • 个人资料不能多次点赞帖子
  • 个人资料不能赞自己的帖子

如果使用 PHP 来获取数据,我被困在将所有类似的 profile_ids(“likers”)存储到数组中的步骤上。这是我目前所拥有的:

SELECT post.*, COUNT(`like`.profile_id) AS like_count 
  FROM post LEFT OUTER JOIN `like` ON post.post_id = `like`.post_id 
    WHERE post.profile_id = "'.$this->profile_id.'" GROUP BY post.post_id

提前致谢。如果我发现任何错误或向我指出任何错误,我会尝试更新。

【问题讨论】:

  • 你看过这篇关于 JOIN 的文字吗:codinghorror.com/blog/2007/10/…? (虽然没有关于 GROUP BY)...
  • 是的,但这对我没有多大好处。不是很深入。
  • 好吧,我不知道您的数据库信息或所有内容的确切结果,但为什么不只是 INNER JOIN 所有表,并通过人员帖子和所有 cmets 过滤掉它们,减去可能对自己的帖子发表评论的人。或者只是获取所有帖子及其对应的 cmets 并通过 cmets 将它们分组在一起,或者对它们进行排序。
  • 这不涉及对初始帖子的回复。我正在专门处理个人的个人资料页面,其中包含特定个人发布的所有帖子的列表、他们从每个帖子中收到的点赞数以及点赞的来源。

标签: php mysql join group-by relational


【解决方案1】:

要从特定个人资料中选择所有帖子,您只需执行以下查询:

SELECT *
FROM posts
WHERE profile_id = (the id number)

要获取所有喜欢给定帖子的个人资料及其数据,您可以执行以下操作:

SELECT *
FROM profiles
WHERE profile_id IN (
    SELECT profile_id
    FROM like
    WHERE post_id = (the post id number) )

将这两个查询与 IN 结合起来,您可以指定个人资料并获取所有喜欢此人个人资料中任何帖子的人的个人资料数据。查询看起来像这样

SELECT *
FROM posts
WHERE profile_id = (the id number)

要获取所有喜欢给定帖子的个人资料及其数据,您可以执行以下操作:

SELECT *
FROM profiles
WHERE profile_id IN (
    SELECT profile_id
    FROM like
    WHERE post_id IN (
        SELECT post_id
        FROM posts
        WHERE profile_id = (the id number) )

如果您想获取帖子信息列表以及所有喜欢每个帖子的人的个人资料数据和帖子本身,您可以使用如下 JOIN...

SELECT *
FROM profiles JOIN posts ON (profiles.post_id = posts.post_id)
WHERE ...

... 这会将两个表中的数据简单地聚合到一个查询中。然后,您可以根据需要提取数据以使用 PHP 进行处理。

如果您想实施规则,例如用户不能喜欢他或她自己的帖子,您必须将其写入您的 php 中,这样当有人尝试点赞帖子时,会验证它是否是他或她的自己的。例如,您不希望允许某人喜欢帖子,将喜欢的内容写入数据库,然后在加载页面时通过查询验证该人是否有权这样做。

【讨论】:

  • 虽然这篇文章很好地解决了我遇到的问题,但它没有返回任何结果并且似乎不起作用。
  • 可能是因为您将表命名为“like”,这是一个 sql 关键字?尝试重命名表格...
  • 您可以使用单词like 作为表名,但您必须在表名周围加上重音符号,如下所示:`like`
  • 你能单独尝试每个子查询并告诉我错误在哪里吗? (当然,为 WHERE 子句替换一个真实的 id)。我目前无权访问测试数据库。
  • 我采取了不同的方法来解决这个问题。你的问题肯定帮助我朝着正确的方向前进,所以我会给你复选框。 :-)
猜你喜欢
  • 2018-07-27
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多