0

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

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

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'

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

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

但是,我建议您尝试重新考虑您的数据库结构:在您的数据库中拥有很多类似的表(每次调查一个表)通常不是一个好主意。一个想法是像这样存储您的调查:

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