计算出现次数

时间:2011-06-04 19:04:16

标签: sql join

我有一个具有以下结构的表:

(table_name, column_name) 

并且对于此表中的每一行,我需要查询table_name中的column_name并在其中执行COUNT(column_name) GROUP BY column_name个值。

目前我做

SELECT * FROM this table 
/*and then*/ foreach row: do another query with: 
  SELECT column_name, COUNT(column_name) GROUP BY column_name

有什么方法可以在一个查询中执行此操作吗? 像

这样的东西
SELECT column_name, COUNT(column_name) 
GROUP BY column_name 
FOREACH(SELECT table_name, column_name FROM my_initial_table)

我知道最后一个查询无效,这只是我想要实现的一个例子。

LE:

告诉我在哪里看的表有2个varchar列

例如:

|++++++++++++++++++++++++++++++++
| table_name | column_name      |
|+++++++++++++++++++++++++++++++|
| logsa      | foo              |
|===============================|
| logsa      | bar              |
|===============================|
| testx      | baz              |
|===============================|

这告诉我现在我也看了表 logsa 的列 foo bar 以及列 baz testx

每个表中的每一列都有VARCHAR作为数据类型,我只需要计算那些相同的列。这就是我在做的事情

SELECT column_name, COUNT(column_name) 
    GROUP BY column_name

4 个答案:

答案 0 :(得分:2)

如果您在MySql中工作,则无法直接使用参数化列名。 使用存储过程和预准备语句可以间接地执行此操作。

一些草率的初稿代码...... 注意反引号`和引号'

之间的区别
  CREATE PROCEDURE CountTables()
  BEGIN
      DECLARE done TINYINT DEFAULT 0;
      DECLARE table_name varchar(30), colunn_name varchar(30);
      DECLARE cur1 CURSOR FOR SELECT
          table_name, column_name
       FROM ColumnTable;

      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
      CREATE TEMPORARY TABLE t1( table_name varchar(30), column_name varchar(30), count int);

      OPEN cur1;
      START TRANSACTION;

    read_loop: LOOP
        FETCH FROM cur1 INTO table_name, column_name;
        IF done THEN LEAVE read_loop; END IF;

        SET insert_sql = CONCAT(  "INSERT INTO `t1`(`table_name`, `column_name`, `count`) SELECT ",
                                   "'", table_name, "', '", column_name, "', count(`", column_name, "`)",
                                  " FROM `",    table_name, "`"  
                               );

        PREPARE insert_stmt FROM insert_sql;
        EXECUTE insert_stmt;
        DEALLOCATE PREPARE insert_stmt;

      END LOOP;
      COMMIT;
      SELECT * FROM t1 GROUP BY column_name;
      DROP TEMPORARY TABLE t1;

    END;

哦,你不要忘记给这个程序打电话:

CALL CountTables();

答案 1 :(得分:0)

子查询应该可以在这里帮助你。这是一个示例(未经测试),应该可以进行一些改进。为了我的示例,我打算将您的表名为 Schema ,在子查询中,我将其命名为 ColumnCount ,以使代码(希望)更具可读性

SELECT Schema.table_name, Schema.column_name, 
  (SELECT COUNT(*) FROM Schema ColumnCount 
  WHERE Schema.column_name = ColumnCount.column_name) AS ColumnUsageCount
FROM Schema

答案 2 :(得分:0)

如果只涉及一个表,则无需进行子选择,只需执行此操作。

SELECT max(table_name) as table_name, column_name, COUNT(*) as occurrence
FROM initial_table
GROUP BY column_name 
ORDER BY column_name

Max(table_name)代替不存在的函数Whatever(table_name) 在MySQL中,您还可以使用group_concat(table_name) as table_names。试试看!

ORDER BY是可选的(在MySQL中不需要),但如果你想要按列名排序也可以很方便。

如果要列出组合table_name + column_name的唯一匹配项,请执行:

SELECT table_name, column_name, COUNT(*) as occurrence
FROM initial_table
GROUP BY table_name, column_name 
ORDER BY table_name, column_name

答案 3 :(得分:-1)

PHP中的

$result=mysql_query("SELECT column_name FROM $table_name");
$row_count = mysql_num_rows($result);

我对mysql不太熟悉,但我认为它沿着这些行

相关问题