gpt4 book ai didi

mysql groupwise max作为第二个where条件

转载 作者:行者123 更新时间:2023-11-29 23:01:13 25 4
gpt4 key购买 nike

我有一个工作查询,看起来效率极低;我想知道我是否缺少一种简单的方法来改进它。

简单表格:

id  date        master_id-------------------------1   2015-02-01  02   2015-02-02  03   2015-02-03  04   2015-02-04  15   2015-02-02  16   2015-02-17  17   2015-02-27  18   2015-01-01  1

目标:获取 master_id 为零的所有行,或者 master_id 不为零且同一 master_id 的其他行没有更早的日期。按日期对每个结果进行排序。

当前查询,使用分组最小子查询创建第二个 WHERE 条件。

SELECT *FROM `test`WHERE `master_id` =0OR `id` IN (    SELECT test.`id`    FROM (        SELECT `master_id`, MIN(`date`) AS mindate        FROM `test`        WHERE `master_id`  0               GROUP BY `master_id`    ) AS x    INNER JOIN `test` ON x.`master_id` = test.`master_id`    AND x.mindate= test.`date`)ORDER BY `date`

它有效,但是 EXPLAIN 让它看起来效率低下:

id  select_type         table       type    possible_keys   key         key_len     ref     rows    Extra-------------------------------------------------------------------------------------------------------------1   PRIMARY             test        ALL     NULL            NULL        NULL        NULL    8       Using where; Using filesort2   DEPENDENT SUBQUERY  derived3    system  NULL            NULL        NULL        NULL    1   2   DEPENDENT SUBQUERY  test        eq_ref  PRIMARY         PRIMARY     4           func    1       Using where3   DERIVED             test        ALL     NULL            NULL        NULL        NULL    8       Using where; Using temporary; Using filesort

我可以改进这个吗?我是否应该将其分成两个查询,一个用于 ID=0,另一个用于分组最小值?提前致谢。

最佳答案

避免内连接可以改进查询:

SELECT *
FROM `test`
WHERE `master_id` =0
OR `id` IN (
SELECT t1.id
FROM (SELECT *
FROM test t2
WHERE t2.master_id!=0
ORDER BY t2.date ASC) t1
GROUP BY t1.master_id
)
ORDER BY `date`;

关于mysql groupwise max作为第二个where条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28482389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com