2014-09-29 38 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; 

乾杯;)