【问题标题】:SQL select multiplicity of items in unionSQL在联合中选择多个项目
【发布时间】:2012-03-15 03:49:57
【问题描述】:

我正在执行几个选择并希望计算重叠。示例:

SELECT id FROM foo WHERE ...
SELECT id FROM bar WHERE ...
SELECT id FROM baz WHERE ...

分别调用这些查询 a、b 和 c。假设 a 给出 (1,2,3,4,5),b 给出 (1,3,5),c 给出 (4,5,6)。我想结合这些并计算多重性。对于上面的例子,我要找的结果是

id | multiplicity
-----------------
1  | 2
2  | 1
3  | 2
4  | 2
5  | 3
6  | 1

如何在 MySQL5 中在一个查询中执行此操作? (a、b 和 c 部分可能是普通选择或存储过程)。

【问题讨论】:

  • 您是否有固定数量的表格和条目,或者它们可能会有所不同?您可以用 0 替换每个缺失的 ID,然后对第一个、第二个、第三个元素等求和...虽然这不是一个优雅的解决方案
  • 我喜欢多重性...

标签: mysql sql union mysql5


【解决方案1】:

我目前无法验证这一点,但我相信这会奏效

SELECT id, count(id) AS multiplicity 
FROM
(
    SELECT id FROM foo WHERE ...
    UNION ALL
    SELECT id FROM bar WHERE ...
    UNION ALL
    SELECT id FROM baz WHERE ...
) AS TablesTogether
GROUP BY id

【讨论】:

  • 谢谢。你知道我是否可以为此添加权重,例如baz 上的权重为 3,我的示例将以 id=5,multiplicity=5;id=6,multiplicity=3 结束?
  • 类似这样的东西:SELECT id, sum(fullcount) AS multiplicity FROM ( SELECT id, (count(id)*weight) as fullcount FROM #foo group by id, weight UNION ALL SELECT id, ( count(id)*weight) as fullcount FROM #bar group by id, weight UNION ALL SELECT id, (count(id)*weight) as fullcount FROM #baz group by id, weight ) AS TablesTogether GROUP BY id
【解决方案2】:

这是加权解决方案的格式化版本(weight_Fooweight_Bar 是常量)

SELECT id, sum(fullcount) AS multiplicity
FROM (
    SELECT id, weight_Foo as fullcount FROM Foo WHERE ...
    UNION ALL
    SELECT id, weight_Bar as fullcount FROM Bar WHERE ...
) AS TemporaryTableName
GROUP BY id

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多