2014-09-29 40 views
0

我有两个MySQL查询从几乎相同的查询中查找MAX()值。我希望有一种方法可以将查询结合起来以获得更好的性能。结合想要不同过滤的最大值的sql查询

SELECT name, MAX(version) AS highest 
FROM publish 
WHERE name IN ('alpha', 'beta') AND deprecated = TRUE 
GROUP BY name; 

SELECT name, MAX(version) AS closed 
FROM publish 
WHERE name IN ('alpha', 'beta') AND open = FALSE 
GROUP BY name; 

该模式非常简单。对于这个简单的例子,它看起来像

CREATE TABLE publish 
(
    name CHAR(36) NOT NULL, 
    version INT NOT NULL, 
    deprecated TINYINT NOT NULL, 
    open TINYINT DEFAULT 0 NOT NULL, 
    PRIMARY KEY (name, version), 
); 
CREATE INDEX open ON publish (open); 
CREATE INDEX deprecated ON publish (deprecated); 

回答

2

可以使用条件聚集到你的查询

SELECT name, MAX(case when open = FALSE then version end) AS closed, 
MAX(case when deprecated = TRUE then version end) AS highest 
FROM publish 
WHERE name IN ('alpha', 'beta') 
GROUP BY name; 
+0

这正是我对这个问题的想法,我只是不知道“CASE”语法存在。 – 2014-09-29 18:19:43

0

结合你可以尝试UNION

SELECT name, MAX(version) AS highest 
FROM publish 
WHERE name IN ('alpha', 'beta') AND deprecated = TRUE 
GROUP BY name 
UNION ALL 
SELECT name, MAX(version) AS closed 
FROM publish 
WHERE name IN ('alpha', 'beta') AND open = FALSE 
GROUP BY name; 

但优化的解决方案是使用CASE(用于条件功能)

SELECT name, MAX(case when deprecated = TRUE then version end) AS highest, 
MAX(case when open = FALSE then version end) AS closed, 
FROM publish 
WHERE name IN ('alpha', 'beta') 
GROUP BY name; 
+0

@Peter:这对您有帮助吗? – 2014-10-14 18:42:24

0

这应该工作

使用UNION(如果你不想重复行)或UNION ALL(当您想检索所有行)

我将使用UNION:

(SELECT name, MAX(version) AS highest FROM publish WHERE deprecated = TRUE) 
UNION 
(SELECT name, MAX(version) AS closed FROM publish WHERE open = FALSE) 
WHERE name IN ('alpha', 'beta') GROUP BY name; 

干杯;)