当前位置: 首页 > 知识库问答 >
问题:

如何更新查询以符合已启用的SQL_MODE=only_full_group_by?[副本]

文志学
2023-03-14

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

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

我想简单地返回每个配置文件所做的最新帖子。例如,我的数据库看起来是这样的;

<table><tbody><tr><th>post_id</th><th>profile_id post_date</th><th> </th></tr><tr><td>0001</td><td>0001</td><td>2019-03-12 00:00:00</td></tr><tr><td>0002</td><td>0002</td><td>2019-03-12 00:00:00</td></tr><tr><td>0003</td><td>0001</td><td>2019-03-12 01:00:00</td></tr><tr><td>0004</td><td>0004</td><td>2019-03-12 00:00:00</td></tr></tbody></table>
<table><tbody><tr><th>post_id</th><th>profile_id post_date</th><th> </th></tr><tr><td>0003</td><td>0001</td><td>2019-03-12 01:00:00</td></tr><tr><td>0002</td><td>0002</td><td>2019-03-12 00:00:00</td></tr><tr><td>0004</td><td>0004</td><td>2019-03-12 00:00:00</td></tr></tbody></table>

共有1个答案

时旭东
2023-03-14

我想简单地返回每个配置文件所做的最新帖子。

要做到这一点,一种不与group by混在一起的方法是使用带有not exists条件的相关子查询,以确保所选的每条记录都是具有相同profile_id的每组记录中最近的一条(我使用列post_date对记录进行排序):

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

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

如果您碰巧使用的是MySQL8.0,那么使用row_number(),这就很简单了:

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
 类似资料:
  • 查询: 有人有解决办法吗?

  • SQL在sql_mode=ONLY_FULL_GROUP_BY中遇到了一些问题,如何重写这个SQL?

  • 问题内容: 我有一个基本的键值表,其中包含每个用户的一些数据。使用更新的mysql进行分组时,其设置为(新的默认值)。当我尝试运行此简单查询时: 我收到以下错误: SQL错误(1055):SELECT列表的表达式#1不在GROUP BY子句中,并且包含未聚合的列’date.user_features.user_id’,该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode = onl

  • 我正在从 elasticsearch 0.90.10 和 NEST 0.12.0 升级到 elasticsearch 1.3.4 和 NEST 1.1.2,并且我正在尝试用函数分数查询替换在 0.90.4 中已弃用的自定义分数查询。 这是我的旧代码: 这是我的新代码: 新代码在使用 SearchParseException 时失败,这是查询(来自.log文件): 完整日志条目: 如果我像这样省略

  • 传输{收集} TransportationID{document} TransportationName:“Private Transaportation” 汽车{收藏} Carid{document} Carname:“Taxi” 车辆名称:“私人出租车” 在集合中,我有超过100辆汽车(文档)。我在文档中或stackoverflow上都找不到如何获取名称具有特定值的所有运输名称。对此如何解决?

  • OTA更新查询与下载 获取access_token 终端设备 终端设备直接接入OTA服务器应当使用Client Credentials模式,client_id为设备id,client_serect为设备令牌. App接入 如果终端设备无法直接接入OTA服务器,而通过App中转,那么App应当也使用Client Credentials模式,client_id为app_id,client_secret