簡體   English   中英

統計 SQL 中出現的次數

[英]Count number of occurrences in SQL

我有一個具有以下結構的表:

(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)

我知道最后一個查詢無效,這只是我希望實現的一個示例(如果可能的話)。

樂:

告訴我去哪里看的表有 2 個 varchar 列

前任:

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

這告訴我,現在我也查看了表logsa的列foobar以及表testx的列baz

每個表中的每一列都有 VARCHAR 作為數據類型,我只需要計算那些相同的列。 我就是這樣做的

SELECT column_name, COUNT(column_name) 
    GROUP BY column_name

如果您在 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();

子查詢應該可以在這里為您提供幫助。 這是一個示例(未經測試),應該進行一些改進。 出於示例的目的,我將調用您的表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

如果只涉及一個表,則無需進行子選擇,只需執行此操作即可。

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)替代了不存在的 function What 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

在 PHP

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

我對 mysql 不太熟悉,但我認為它沿着這些思路

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM