在MySQL中选择多个列

时间:2013-11-27 22:31:11

标签: mysql

我需要将两列合并到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    |

4 个答案:

答案 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_CONCATIF相结合会导致以“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.columnsinformation_schema.tables进行查询,但