【问题标题】:Combine multiple MySQL UNION queries for optimization结合多个 MySQL UNION 查询进行优化
【发布时间】:2019-06-09 20:30:33
【问题描述】:

我必须将这些多个 UNION 查询结合起来......

SELECT 'Mercedes' AS marke, COUNT(autos.id) FROM autos WHERE a1=1 
UNION 
SELECT 'BMW' AS marke, COUNT(autos.id) FROM autos WHERE a2=1 
UNION 
SELECT 'Ford' AS marke, COUNT(autos.id) FROM autos WHERE a3=1

我怎样才能只用一个查询来做到这一点?

【问题讨论】:

  • 是的,使用 CASE 表达式将 WHERE 子句中的条件转换为 marke 值,然后再转换为 GROUP BY marke...但是为了迂腐,UNION 已经是一个组合查询的单个查询。
  • 正常模式是说COUNT(*)。说COUNT(x) 具有不计算x IS NULL 的“特征”;这似乎与您的情况无关。

标签: mysql select query-optimization union


【解决方案1】:

如果您希望摆脱UNIONs,您可以使用带有CASE 表达式的聚合查询来解码marke

SELECT
    CASE
        WHEN a1 = 1 THEN 'Mercedes'
        WHEN a2 = 1 THEN 'BMW'
        WHEN a3 = 1 THEN 'Ford'
    END AS marke,
    COUNT(autos.id)
FROM autos
WHERE a1 = 1 OR a2 = 1 OR a3 = 1
GROUP BY a1, a2, a3

【讨论】:

  • 这个不应该按mark分组吗??而不是按 a1、a2、a3 分组??
  • @Shoaeb :这应该可以正常工作。你能测试一下查询并告诉我结果吗?
  • 这可能不完全相同。考虑a2=1a3=1 的情况。
  • @RickJames:啊,我想我明白你的意思了。在这种情况下,原始查询将返回两行,而我只有一个,对吧?
  • @GMB - 由于 OP 不清楚,您的结果可能比推定的 UNION 查询更“正确”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多