我有一个包含几种不同类型调查的数据库。每个调查在数据库中都有自己的表。一些调查结构相同。它们具有相同的列数。我想根据表名包含的内容和列数选择调查的子集。
我想要的调查可以有两个不同的名称,它们都包含名称中的数字:
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'
我很困惑如何将上面的两个表达式组合起来,只获得满足第一个表达式且只有给定列数的表。
答案 0 :(得分: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? | ....