2

我在下面有以下数据库表 在此处输入图像描述

我想用owner_id1 向用户显示通知。通知显示告诉所有者两个用户(ID 为 17 和 2)用post_id1 评论了他/她的帖子。我尝试了以下查询,但它返回 2 行。我如何构造查询以返回一行,因为我希望一起返回一篇帖子的通知?谢谢你。

SELECT DISTINCT commenters_id, id, owner_id, 
                post_id, type, UNIX_TIMESTAMP(date_done) AS date 
FROM notification 
GROUP BY commenters_id 
HAVING owner_id = '$user_id' AND commenters_id != '$user_id' 
ORDER BY date_done DESC
4

3 回答 3

1

此代码不会为您提供commenters_id,而是计算有多少人回复了每个帖子。这date将是最后一次有人回复该特定帖子:

SELECT
    COUNT(DISTINCT commenters_id) AS commenter_count,
    owner_id,
    post_id,
    type,
    UNIX_TIMESTAMP(MAX(date_done)) AS date 
FROM notification
WHERE owner_id = '$user_id' AND commenters_id != '$user_id' 
GROUP BY owner_id, post_id, type
ORDER BY UNIX_TIMESTAMP(MAX(date_done)) DESC
于 2012-04-17T07:38:53.927 回答
1

您可以使用GROUP_CONCAT(commenters_id)获取帖子的评论者 ID 的逗号分隔列表。但是你必须按帖子而不是评论者分组,所以查询看起来像:

SELECT DISTINCT GROUP_CONCAT(commenters_id), id, owner_id, 
                post_id, type, UNIX_TIMESTAMP(date_done) AS date 
FROM notification 
GROUP BY post_id 
HAVING owner_id = '$user_id' AND commenters_id != '$user_id' 
ORDER BY date_done DESC

如果需要,GROUP_CONCAT 允许对数据进行一些处理,例如仅返回不同的值或对值进行排序。在此处查看完整文档:http: //dev.mysql.com/doc/refman/5.5/en/group-by-functions.html#function_group-concat

于 2012-04-17T07:40:21.680 回答
0

您的问题是您也选择了 date_done 列,这使得行是唯一的。DISTINCT在这种情况下,也不允许GROUP BY对结果集进行分组。

将此列排除在此查询之外或使用类似MAX(date_done)

编辑:等等......你已经只有两行,而不是四行?这不就是你想要的结果吗?也许我误解了这个问题

于 2012-04-17T07:36:49.570 回答