Mysql 多列计数

Mysql 多列计数,mysql,sql,Mysql,Sql,我搜索了这个网站,发现了一些类似的问题,但没有找到具体解决这个问题的方法。因此,答案不太适合这个问题。我有一个12列的表。这十二列中的六列(一列、二列、三列、四列、五列、六列)的评级表示为数值1到100。所以我可能有一行(rowId=7),这六列中的每一列都有一个唯一的数值。我想做的是按出现频率列出数值,将所有六列视为一个总数。我不在乎第一栏和第四栏的评级频率。我只需要所有列的频率。看起来似乎联合是一条路要走,但联合不能使用排序规则进行排序。我已经处理了几个不同的、最终不成功的查询。与其在这里逐

我搜索了这个网站,发现了一些类似的问题,但没有找到具体解决这个问题的方法。因此,答案不太适合这个问题。我有一个12列的表。这十二列中的六列(一列、二列、三列、四列、五列、六列)的评级表示为数值1到100。所以我可能有一行(rowId=7),这六列中的每一列都有一个唯一的数值。我想做的是按出现频率列出数值,将所有六列视为一个总数。我不在乎第一栏和第四栏的评级频率。我只需要所有列的频率。看起来似乎联合是一条路要走,但联合不能使用排序规则进行排序。我已经处理了几个不同的、最终不成功的查询。与其在这里逐条列举这些失败,我只想问问是否有人知道这样做的方法。

这里有一个相当有效的方法:

select (case when n.n = 1 then t.one
             when n.n = 2 then t.two
             when n.n = 3 then t.three
             when n.n = 4 then t.four
             when n.n = 5 then t.five
             when n.n = 6 then t.six
        end) as col, count(*) as cnt
from t cross join
     (select 1 as n union all select 2 union all select 3 union all
      select 4 union all select 5 union all select 6
     ) n
group by (case when n.n = 1 then t.one
               when n.n = 2 then t.two
               when n.n = 3 then t.three
               when n.n = 4 then t.four
               when n.n = 5 then t.five
               when n.n = 6 then t.six
          end)
当您使用
union
(或
union all
)连接不同的列时,每个子查询使用单独的数据传递。此替代方法将表连接到数字表,只读取该表一次。然后,它使用
case
语句根据数字选择哪一列


最后一步是简单地进行聚合以获得计数。

以下是一种相当有效的方法:

select (case when n.n = 1 then t.one
             when n.n = 2 then t.two
             when n.n = 3 then t.three
             when n.n = 4 then t.four
             when n.n = 5 then t.five
             when n.n = 6 then t.six
        end) as col, count(*) as cnt
from t cross join
     (select 1 as n union all select 2 union all select 3 union all
      select 4 union all select 5 union all select 6
     ) n
group by (case when n.n = 1 then t.one
               when n.n = 2 then t.two
               when n.n = 3 then t.three
               when n.n = 4 then t.four
               when n.n = 5 then t.five
               when n.n = 6 then t.six
          end)
当您使用
union
(或
union all
)连接不同的列时,每个子查询使用单独的数据传递。此替代方法将表连接到数字表,只读取该表一次。然后,它使用
case
语句根据数字选择哪一列

最后一步是简单地进行聚合以获得计数。

您的意思是这样吗

SELECT V, COUNT(*) C
FROM (
    SELECT one V FROM your_table
    UNION ALL
    SELECT two FROM your_table
    UNION ALL
    SELECT three FROM your_table
    UNION ALL
    SELECT four FROM your_table
    UNION ALL
    SELECT five FROM your_table
    UNION ALL
    SELECT six FROM your_table
) Q
GROUP BY V
ORDER BY C DESC;

这将为您提供每个不同的值,以及它出现的次数(与列无关)。

您的意思是这样吗

SELECT V, COUNT(*) C
FROM (
    SELECT one V FROM your_table
    UNION ALL
    SELECT two FROM your_table
    UNION ALL
    SELECT three FROM your_table
    UNION ALL
    SELECT four FROM your_table
    UNION ALL
    SELECT five FROM your_table
    UNION ALL
    SELECT six FROM your_table
) Q
GROUP BY V
ORDER BY C DESC;


这将为您提供每个不同的值,以及它出现的次数(不考虑列)。

您所说的“将所有六列视为一个总数”是什么意思?我的意思是,我需要列出每一个可能的值,1到100,按它们出现在六列中的频率排序。不管是在第1列还是第4列。我需要它们按所有六列中出现的总数排序。你说的“将所有六列视为一个总数”是什么意思?我的意思是,我需要列出每一个可能的值,从1到100,按它们在任何六列中出现的频率排序。不管是在第1列还是第4列。我需要按所有六列的总出现次数来排序。你能帮我把它拆开一点吗?我认为需要创建一个案例,n.n是从1到100的每个值,但这不可能是正确的。你能解释一下这个问题发生了什么吗?你能帮我解释一下吗?我认为需要创建一个案例,n.n是从1到100的每个值,但这不可能是正确的。你能解释一下这个问题发生了什么吗?这很奇怪。很接近,但有两个问题。当我在我的实时数据库上运行它时,它会抛出一个错误。我很确定我能把那部分熨平,但问题是小提琴产生的结果不是我所需要的。根据在小提琴中创建的表格,结果需要类似于0 5 10 20 25 30 50或类似的值,因为0出现的次数最多,5、10、20、25和30都出现两次,50出现一次。我需要一个完整的值列表,该列表按该值在六列中出现的次数排序。@BlindFish它会抛出什么错误?除此之外,你为什么期望(例如)10在20之前,而20更频繁?顺便说一句,10不会出现两次。您真的想按值排序而不是计数吗?更正之前的注释。在live DB上运行时,我确实消除了语法错误,但结果毫无意义。它在两列中返回了8个结果,分别是TOTAL和C。在TOTAL列中有8个值,所有值都在100到200之间,在C列中每次列出1个。我不知道它是否认为这8次中的每一次都出现了“1”(不可能),或者它是否认为表中唯一的值都超出了范围(>100),并且只出现了一次。这也是不可能的。@BlindFish让我换一种说法:即使多个字段(在同一行中)包含相同的值,您是否希望每行最多计算一次值?@BlindFish显然,我没有访问您数据库的权限,因此,请集中精力解释我的SQL Fiddle示例的错误所在——这是我理解您真正想要的东西的唯一方法……这很奇怪。很接近,但有两个问题。当我在我的实时数据库上运行它时,它会抛出一个错误。我很确定我能把那部分熨平,但问题是小提琴产生的结果不是我所需要的。根据在小提琴中创建的表格,结果需要类似于0 5 10 20 25 30 50或类似的值,因为0出现的次数最多,5、10、20、25和30都出现两次,50出现一次。我需要一个完整的值列表,该列表按该值在六列中出现的次数排序。@BlindFish它会抛出什么错误?除此之外,你为什么期望(例如)10在20之前,而20更频繁?顺便说一句,10不会出现两次。您真的想按值排序而不是计数吗?更正之前的注释。在live DB上运行时,我确实消除了语法错误,但结果毫无意义。它在两列中返回了8个结果,分别是TOTAL和C。在TOTAL列中有8个值,所有值都在100到200之间,在C列中每次列出1个。