Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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
mysql groupwise max作为第二个where条件_Mysql_Sql_Groupwise Maximum - Fatal编程技术网

mysql groupwise max作为第二个where条件

mysql groupwise max作为第二个where条件,mysql,sql,groupwise-maximum,Mysql,Sql,Groupwise Maximum,我有一个工作查询,似乎效率非常低;我想知道我是否缺少一个简单的方法来改进它 简单表格: id date master_id ------------------------- 1 2015-02-01 0 2 2015-02-02 0 3 2015-02-03 0 4 2015-02-04 1 5 2015-02-02 1 6 2015-02-17 1 7 2015-02-27 1 8 2015-01-01 1 目标:获取主控id为

我有一个工作查询,似乎效率非常低;我想知道我是否缺少一个简单的方法来改进它

简单表格:

id date master_id ------------------------- 1 2015-02-01 0 2 2015-02-02 0 3 2015-02-03 0 4 2015-02-04 1 5 2015-02-02 1 6 2015-02-17 1 7 2015-02-27 1 8 2015-01-01 1 目标:获取主控id为零或主控id不为零且同一主控id的其他行没有更早日期的所有行。按日期排序每个结果

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

SELECT * FROM `test` WHERE `master_id` =0 OR `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` 它是有效的,但解释使它看起来效率低下:

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 filesort 2 DEPENDENT SUBQUERY derived3 system NULL NULL NULL NULL 1 2 DEPENDENT SUBQUERY test eq_ref PRIMARY PRIMARY 4 func 1 Using where 3 DERIVED test ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort
我能改进一下吗?我是否应该将其分为两个查询,一个用于ID=0,另一个用于groupwise min?提前感谢。

避免内部联接可以改进查询:

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`;
这个怎么样

SELECT * FROM test WHERE master_id = 0
UNION 
SELECT x.*
  FROM test x
  JOIN (SELECT master_id,MIN(date) min_date FROM test GROUP BY master_id) y
    ON y.master_id = x.master_id 
   AND y.min_date = x.date;

有时候,我发现有单独的选择有助于提高速度。为此我得到了一把sqlfiddle?@草莓当然:这看起来不错;第一个子查询是否总是根据其顺序从第二个子查询中选择第一行的ID?当mysql在没有任何聚合函数的情况下对行进行分组时,它是否总是为每个与GROUPBY条件匹配的列选择它找到的第一个值?