MySQL:根据列数选择多个表

MySQL:根据列数选择多个表,mysql,multiple-tables,information-schema,limesurvey,Mysql,Multiple Tables,Information Schema,Limesurvey,我有一个包含几种不同类型调查的数据库。每个调查在数据库中都有自己的表。有些调查具有相同的结构。它们具有相同的列数。我想根据表名包含的内容和列数选择调查的子集 我想要的调查可以有两个不同的名称,名称中都包含数字: SELECT table_name FROM information_schema.TABLES WHERE ((TABLE_NAME like '%ls_survey_%') or (TABLE_NAME like '%ls_old_survey_%')) and TABLE_NA

我有一个包含几种不同类型调查的数据库。每个调查在数据库中都有自己的表。有些调查具有相同的结构。它们具有相同的列数。我想根据表名包含的内容和列数选择调查的子集

我想要的调查可以有两个不同的名称,名称中都包含数字:

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'

对于如何组合上面的两个表达式以只得到满足第一个表达式且只有给定列数的表,我感到很困惑

当然可以,您可以查询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
然而,我建议您尝试重新考虑您的数据库结构:在您的数据库中有许多类似的表(每个调查一个表)通常不是一个好主意。一个想法是将您的调查存储如下:

ID survey | Question   | Answer
--------------------------------
3456      | question1? | ....
3465      | question2? | ....
3456      | question3? | ....
7777      | question1? | ....
7777      | question4? | ....
7777      | question5? | ....

谢谢你的回答。数据库结构是在我试图从LimeSurvey(开源调查系统)获得类似调查时给出的。