【问题标题】:(My)SQL - Count values from table in different columns(Mysql - 计算不同列中表中的值
【发布时间】:2014-05-12 18:54:48
【问题描述】:

我需要获取表中每个值的计数。问题是我需要从一张表的 3 列中取出它。

(简化的)数据库表如下所示:

+---------+------+--------+------+
|   Id    | Col1 | Col2   | Col3 | 
+---------+------+--------+------+
|    1    |  a   |  a     |      |
|    2    |  b   | null   |  a   |
|    3    |  b   |  b     |  c   |
|    4    |  d   |  a     |  null|
|    5    |  a   |  c     |  c   |
+---------+------+--------+------+

这就是我需要的结果:

+-------+-------+
|  Col  | Count |
+-------+-------+
|   a   |   5   |
|   b   |   3   |
|   c   |   3   |
|   d   |   1   |
+-------+-------+

有什么建议吗?

编辑:我还想获得计数最高的 x 行的顶部,即使在通过 asc/desc 对 count 或 col 进行排序时,必须显示 10 HIGHEST。我发现当我按 Count desc 订购时,简单的限制 10 不起作用。然后我会得到 10 个最低值而不是最高值。

【问题讨论】:

  • 这种问题是设计不佳的症状,但 UNION 会得到你想要的。
  • 使用带有 1 列的 UNION ALL 并在外部查询中计算值。
  • 我知道这是糟糕的设计,但它不是我的数据库,我不允许更改数据库中的任何内容。
  • 对于你的问题的第二部分,我建议你提供一个更具代表性的数据集和期望的结果。 Sqlfiddle 对此很有用。

标签: mysql sql


【解决方案1】:

最简单的可能是UNION ALLGROUP BY

SELECT col, COUNT(*) count
FROM (
  SELECT col1 col FROM mytable UNION ALL 
  SELECT col2 col FROM mytable UNION ALL 
  SELECT col3 col FROM mytable
)z
GROUP BY col
HAVING col IS NOT NULL
ORDER BY count DESC
LIMIT 10

An SQLfiddle to test with.

如果您希望它限制在前 10 名但订购另一个方向,you can just wrap it in a subquery and order the outer one

【讨论】:

    【解决方案2】:

    您的原始问题可以使用union all 解决,然后sum 使用case

    select 'a', sum(
      (case when col1 = 'a' then 1 else 0 end)+
      (case when col2 = 'a' then 1 else 0 end)+
      (case when col3 = 'a' then 1 else 0 end))
    from yourtable
    union all
    select 'b', sum(
      (case when col1 = 'b' then 1 else 0 end)+
      (case when col2 = 'b' then 1 else 0 end)+
      (case when col3 = 'b' then 1 else 0 end))
    from yourtable
    ...
    

    【讨论】:

      猜你喜欢
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 2019-10-11
      • 2011-07-07
      • 2015-08-19
      相关资源
      最近更新 更多