我有两个MySQL查询,它们从几乎相同的查询中找到MAX()值。我希望有一种方法可以将查询结合起来以获得更好的性能。
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);
答案 0 :(得分: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;
答案 1 :(得分: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;
答案 2 :(得分: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;
干杯;)