MySQL迭代列名

时间:2016-05-09 10:02:22

标签: mysql sql

我需要你的SQL帮助。 :)

我有一张看起来像这样的表:

Column1   Column2   Column3   ...
null       null       x        
x           x         null
x          null       null
x          null       x
...

我想选择count foreach列,并按此计数得到这样的结果:

Column1    1034
Column24   876
Column3    567
...

目前,我知道如何选择我的列名:

SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'my_table';

我知道如何计算SQL:

COUNT(my_column);

我想知道是否可以在SQL中执行此操作,因为我需要在phpmyadmin中创建一个视图。

顺便说一句,请原谅我糟糕的英语! ;)

非常感谢那些花时间帮助我的人!

1 个答案:

答案 0 :(得分:0)

您希望使用UNION组合多个计数查询,如下所示:

(SELECT 'Column1' AS `COLUMN_NAME`, COUNT(Column1) AS Count FROM my_table)
UNION ALL
(SELECT 'Column2' AS `COLUMN_NAME`, COUNT(Column2) AS Count FROM my_table)
-- ...
ORDER BY Count DESC

如果您需要动态构建此类查询(例如,因为您事先不知道列名称 1 ),那么您可以使用查询结果以您选择的语言执行此操作关于信息架构。

如果您选择的语言恰好是MySQL,那么您可以使用其SQL syntax for prepared statements

SELECT CONCAT(
         GROUP_CONCAT('(
           SELECT ', QUOTE(COLUMN_NAME), ' AS `COLUMN_NAME`,
                  COUNT(`', REPLACE(COLUMN_NAME, '`', '``'), '` AS Count
           FROM   my_table
         )'
         SEPARATOR ' UNION ALL '
       ), '
       ORDER BY Count DESC
       ')
INTO   @sql
FROM   INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_NAME = 'my_table';

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

1。拥有这种动态模式通常表明设计不佳。