Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何构造这种sql查询_Php_Mysql_Database - Fatal编程技术网

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。我对它进行了编辑并添加了不同的内容。谢谢你指出!