0

いくつかの異なる種類の調査を含むデータベースがあります。各調査には、データベース内に独自のテーブルがあります。一部の調査は同じ構造を持っています。これらは同じ数の列を持っています。テーブル名の内容と列数に基づいて調査のサブセットを選択したいと考えています。

必要な調査には 2 つの異なる名前を付けることができ、すべての名前に数字が含まれています。

SELECT table_name FROM information_schema.TABLES 
WHERE ((TABLE_NAME like '%ls_survey_%') or (TABLE_NAME like '%ls_old_survey_%')) 
and TABLE_NAME rlike '[0123456789]'

ここまでは順調ですね。次のようにして、テーブルの列数を取得できることを知っています。

SELECT count(*) FROM information_schema.COLUMNS WHERE table_name = 'tableName'

上記の 2 つの式を組み合わせて、最初の式を満たし、指定された数の列のみを持つテーブルのみを取得する方法について、私は困惑しています。

4

1 に答える 1

0

確かに可能です。COLUMNS テーブルにクエリを実行し、HAVING 句で GROUP BY クエリを使用できます。

SELECT `table_name` 
FROM
  `information_schema`.`columns` 
WHERE
  `table_schema`=DATABASE() 
  AND (`table_name` LIKE '%ls_survey_%' OR `table_name` LIKE '%ls_old_survey_%')
  AND `table_name` RLIKE '[0123456789]'
GROUP BY
  `table_name`
HAVING
  COUNT(*)=3 -- number of columns

ただし、データベースの構造を再考することをお勧めします。データベースに、調査ごとに 1 つずつ、類似したテーブルを多数持つことは、多くの場合、良い考えではありません。アイデアは、次のように調査を保存することです。

ID survey | Question   | Answer
--------------------------------
3456      | question1? | ....
3465      | question2? | ....
3456      | question3? | ....
7777      | question1? | ....
7777      | question4? | ....
7777      | question5? | ....
于 2014-11-19T22:51:52.450 に答える