Php 如何构造这种sql查询
我有下面的数据库表 我想用Php 如何构造这种sql查询,php,mysql,database,Php,Mysql,Database,我有下面的数据库表 我想用owner\u id1向用户显示通知。通知显示告诉所有者有两个用户(id分别为17和2)使用post\u id1对其帖子发表了评论。 我尝试了以下查询,但它返回了2行。我如何构造查询以返回一行,因为我希望一篇文章的通知一起返回?多谢各位 SELECT DISTINCT commenters_id, id, owner_id, post_id, type, UNIX_TIMESTAMP(date_done) AS date FROM
owner\u id
1向用户显示通知。通知显示告诉所有者有两个用户(id分别为17和2)使用post\u id
1对其帖子发表了评论。
我尝试了以下查询,但它返回了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
您的问题是您也选择了date_done列,这使得行是唯一的。 在这种情况下,
DISTINCT
和groupby
都不允许对结果集进行分组
将该列保留在此查询之外,或使用类似于MAX(date\u done)
编辑:
等等…你已经只有两排了,不是四排了吗?这不是你想要的结果吗?也许我理解错了这个问题这段代码不会给你评论者id,而是计算每个帖子的回复人数。
日期将是最后一次有人回复该特定帖子:
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
您可以使用获取帖子的评论者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允许在需要时对数据进行一些处理,例如只返回不同的值或对值进行排序。请参阅此处的完整文档:因此,如果您只希望返回一行,您希望如何判断有两个人已回复?您喜欢在VARCHAR字段中用逗号分隔回复人列表吗?(例如,'2,17'
)。或哦你只需要计数吗?@ANisus是的,我先要计数,然后我会分离返回的分组评论者id。现在听起来很荒谬。你说的“分离返回的分组评论者id”是什么意思?当你对评论人的id进行分组时,你可以得到最大值、最小值、计数等。你不会得到一个id列表,你以后可以将其拆分为单独的id。我只是在没有完成日期的情况下尝试了它,它仍然返回了相同的结果。Mysql有分组吗?整洁的我非常希望在MS Sql server中实现这一点!谢谢,但我在“having子句”中得到了错误-未知列“commenters\u id”。请问我该如何解决这个问题?嘿,我添加了DISTINCT to COUNT(commenters_id),这给了我一些有趣的东西。谢谢。@Chibuzo:啊!当然这是我代码中的一个bug。我对它进行了编辑并添加了不同的内容。谢谢你指出!