我需要将两列合并到information_schema
的一个返回表中。
所以,我有多个带字段的表。在每个表格中都有一些管理字段(例如,id,lastmodify等)和其他(我需要的)以' F _'开头。
SELECT TABLE_NAME, COLUMN_NAME FROM information_schema.columns WHERE TABLE_SCHEMA = "wyro" AND COLUMN_NAME LIKE "F_%" AND TABLE_NAME LIKE "D_%"
一切都很好,如果有像'F _%'但是如果缺少这些字段,则该表不在查询结果中。我尝试使用左/右连接的几种方式,但在同一个表上使用它不会带来太多结果。
我需要一个输出:
| TABLE_NAME | COLUMN_NAME |
| D_blabla | F_blabla |
| D_blabla2 | F_blabla2 |
| D_blabla3 | |
| D_blabla4 | F_blabla |
答案 0 :(得分:1)
您需要左连接两个结果集才能获得所需内容。
第一个是
SELECT DISTINCT TABLE_NAME
FROM information_schema.columns
WHERE TABLE_SCHEMA = 'wyro'
AND TABLE_NAME LIKE 'D\_%'
第二个是:
SELECT TABLE_NAME, COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_SCHEMA = 'wyro'
AND COLUMN_NAME LIKE 'F\_%'
AND TABLE_NAME LIKE 'D\_%'
您可以像这样加入他们以获得所需的结果集。
SELECT a.TABLE_NAME, b.COLUMN_NAME
FROM (
SELECT DISTINCT TABLE_NAME
FROM information_schema.columns
WHERE TABLE_SCHEMA = 'wyro'
AND TABLE_NAME LIKE 'D\_%'
) AS a
LEFT JOIN (
SELECT TABLE_NAME, COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_SCHEMA = 'wyro'
AND COLUMN_NAME LIKE 'F\_%'
AND TABLE_NAME LIKE 'D\_%'
) AS b ON a.TABLE_NAME = b.TABLE_NAME
这很复杂,主要是因为你有两个单独指定的结果组合。第一组是名称以“D_”开头的所有表,第二组是您需要的所有列。
修改:转发LIKE 'F\_%'
及类似内容。
答案 1 :(得分:0)
SELECT
TABLE_NAME,
GROUP_CONCAT(IF(COLUMN_NAME LIKE "F_%", COLUMN_NAME, NULL)) AS COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_SCHEMA = "wyro" AND TABLE_NAME LIKE "D_%"
GROUP BY TABLE_NAME
GROUP_CONCAT
与IF
相结合会导致以“F_”开头的所有列合并为COLUMN_NAME
。如果只有一个,这种方法可行。
如果表格中有多个以“F_”开头的字段,则会将它们连接起来,例如“F_abc,F_boo,F_bar”。
答案 2 :(得分:0)
这可以通过CASE语句完成,不需要连接
SELECT TABLE_NAME, case when COLUMN_NAME LIKE "F_%" THEN COLUMN_NAME ELSE '' END AS COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_SCHEMA = "wyro"
AND TABLE_NAME LIKE "D_%"
答案 3 :(得分:0)
SELECT T.TABLE_NAME,
IFNULL(C.COLUMN_NAME,'') AS COLUMN_NAME
FROM
(SELECT TABLE_NAME
FROM information_schema.tables
WHERE TABLE_NAME LIKE 'D|_%' ESCAPE '|'
AND TABLE_SCHEMA = 'wyro'
)as T
LEFT JOIN
(SELECT TABLE_NAME,COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_NAME LIKE 'D|_%' ESCAPE '|'
AND COLUMN_NAME LIKE 'F|_%' ESCAPE '|'
AND TABLE_SCHEMA = 'wyro'
)as C
USING (TABLE_NAME);
在此sqlfiddle进行了测试
不确定为什么sqlfiddle要从information_schema.columns
或information_schema.tables
进行查询,但