Php 如何更新查询以符合sql\u mode=only\u full\u group\u by enabled?
在上次MySQL更新之后,我一直在寻找一种方法来更正我的查询。我知道GROUPBY列不是唯一的,但我不知道如何更新查询以符合严格的规则,并且仍然保留我要查找的结果。有人有什么建议吗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
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