我有一个具有以下结构的表:
(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
答案 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)
$result=mysql_query("SELECT column_name FROM $table_name");
$row_count = mysql_num_rows($result);
我对mysql不太熟悉,但我认为它沿着这些行