Подсчитать количество вхождений в SQL - PullRequest
4 голосов
/ 04 июня 2011

У меня есть таблица со следующей структурой:

(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

Ex:

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

Это говорит мне, что теперь я тоже смотрю в столбцы foo и bar таблицы logsa и столбец baz таблицы testx

Каждый столбец в каждой таблице имеет тип данных VARCHAR, и мне просто нужно сосчитать те, которые совпадают. вот так я и делал

SELECT column_name, COUNT(column_name) 
    GROUP BY column_name

Ответы [ 4 ]

2 голосов
/ 05 июня 2011

Если вы работаете в 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();
0 голосов
/ 04 июня 2011

Подзапрос должен быть в состоянии помочь вам здесь.Это пример (не проверенный), который должен работать с некоторыми уточнениями.Я собираюсь назвать вашу таблицу Схема для целей моего примера, а в подзапросе я собираюсь назвать ее как ColumnCount , чтобы сделать код (надеюсь) более читабельным.

SELECT Schema.table_name, Schema.column_name, 
  (SELECT COUNT(*) FROM Schema ColumnCount 
  WHERE Schema.column_name = ColumnCount.column_name) AS ColumnUsageCount
FROM Schema
0 голосов
/ 04 июня 2011

Нет необходимости делать выборку, просто сделайте это, если задействована только одна таблица.

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 не требуется), но может быть удобно, если вы хотите, чтобы он также сортировался по имени столбца.

Если вы хотите перечислить уникальные вхождения экземпляраимя комбинированной таблицы + имя столбца do:

SELECT table_name, column_name, COUNT(*) as occurrence
FROM initial_table
GROUP BY table_name, column_name 
ORDER BY table_name, column_name
0 голосов
/ 04 июня 2011

в PHP

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

Я не слишком знаком с mysql, но я думаю, что в том же духе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...