Php 如何更新查询以符合sql\u mode=only\u full\u group\u by enabled?

Php 如何更新查询以符合sql\u mode=only\u full\u group\u by enabled?,php,mysql,sql,Php,Mysql,Sql,在上次MySQL更新之后,我一直在寻找一种方法来更正我的查询。我知道GROUPBY列不是唯一的,但我不知道如何更新查询以符合严格的规则,并且仍然保留我要查找的结果。有人有什么建议吗 SELECT $SQLTable_Posts.`post_id`, $SQLTable_Posts.`profile_id`, $SQLTable_Posts.`post_title`, $SQLTable_Posts.`post_slug`, $SQLTable_P

在上次MySQL更新之后,我一直在寻找一种方法来更正我的查询。我知道GROUPBY列不是唯一的,但我不知道如何更新查询以符合严格的规则,并且仍然保留我要查找的结果。有人有什么建议吗

SELECT 
    $SQLTable_Posts.`post_id`, 
    $SQLTable_Posts.`profile_id`, 
    $SQLTable_Posts.`post_title`, 
    $SQLTable_Posts.`post_slug`, 
    $SQLTable_Posts.`post_date`
FROM $SQLTable_Posts
WHERE $SQLTable_Posts.`post_date` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY $SQLTable_Posts.`profile_id`
ORDER BY $SQLTable_Posts.`post_date` DESC
我想简单地返回每个配置文件的最新帖子。例如,我的数据库如下所示

post\u idprofile\u id post\u日期00010002019-03-12 00:00:00000 200022019-03-12 00:00:00000 300012019-03-12 01:00:00000 400042019-03-12 00:00
我想简单地返回每个配置文件的最新帖子

要做到这一点,而不必与
GROUP BY混为一谈,一种方法是使用一个具有
NOT EXISTS
条件的相关子查询,以确保所选的每个记录都是具有相同
配置文件id
的每组记录中的最新记录(我使用列
post\u date
对记录进行排序):

注意:我简化了查询,删除了这里不需要的长表前缀(和/或可以替换为短表别名)


如果您碰巧使用的是MySQL 8.0,那么使用
ROW\u NUMBER()
就可以直接做到这一点:


你想要的结果是什么?给我们一个例子,您选择的每一列都应该聚合(计数、求和等)或在您的GROUP BY子句中。sql如何知道它应该为profile_id 0001使用post_id 0003还是0001?“该选哪一个?”坤灿我明白你的意思,很感激你让我思考。以前,因为我按日期排序并按用户分组,所以它将获取最新的,但是我没有看到任何文档说明如何告诉sql首先获取哪个。如果
profile\u id
是主键,则不需要做任何特殊操作,因为所有其他列在功能上都依赖于它。这个解决方案工作得很好,谢谢。然而,我只是注意到,如果有两篇文章的时间戳完全相同,它们都会出现。我们应该更新它以过滤这些内容。@epool:好的,为此我们需要稍微调整查询。您使用的是哪个版本的查询,是
不存在的查询
还是
行号()的查询
?是不存在的查询,因此您可以将子查询的
WHERE
子句更改为:
其中p1.profile\u id=p.profile\u id和(p1.post\u-date>p.post\u-date或(p1.post\u-date=p.post\u-date和p1.post\u-id>p.post\u-id)
。当有相同时间戳的帖子时,将选择id最大的帖子。完美无瑕!优秀的解决方案。
SELECT 
    `post_id`, 
    `profile_id`, 
    `post_title`, 
    `post_slug`, 
    `post_date`
FROM $SQLTable_Posts p
WHERE 
    `post_date` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
    AND NOT EXISTS (
        SELECT 1
        FROM $SQLTable_Posts p1
        WHERE p1.`profile_id` = p.`profile_id` AND p1.`post_date` > p.`post_date`
    )
ORDER BY `post_date` DESC
SELECT *
FROM (
    SELECT 
        `post_id`, 
        `profile_id`, 
        `post_title`, 
        `post_slug`, 
        `post_date`,
        ROW_NUMBER() OVER(PARTITION BY `profile_id` ORDER BY `post_date` DESC) rn
    FROM $SQLTable_Posts p
    WHERE `post_date` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
) x WHERE rn = 1
ORDER BY `post_date` DESC