【问题标题】:MySQL Iterate over column namesMySQL 遍历列名
【发布时间】:2016-05-10 00:19:54
【问题描述】:

我需要您在 SQL 方面的帮助。 :)

我有一张这样的桌子:

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

我想为每个列选择计数,并按此计数得到类似此顺序的结果:

Column1    1034
Column24   876
Column3    567
...

现在,我知道如何选择我的列名:

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

而且我知道如何在 SQL 中计数:

COUNT(my_column);

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

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

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

【问题讨论】:

标签: mysql sql


【解决方案1】:

您想使用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.拥有这种动态模式通常表明设计不佳。

【讨论】:

  • 嗨蛋!你解决了我的问题!非常感谢!
猜你喜欢
  • 2011-06-24
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2023-03-17
  • 2021-12-14
  • 2017-05-27
相关资源
最近更新 更多