[英]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的列foo和bar以及表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.