复杂的SELECT

时间:2015-03-31 15:55:05

标签: mysql sql database

也许我正朝着错误的方向前进,所以我喜欢关于如何以不同的方式处理这个问题的一些指示。

我有多个MySql数据库表,每个表有50个以上的TEXT字段(类别)(原因,问题,原因,处置......等等),其中一些(大多数)是空的,有些不是,取决于关于他们描述的项目。

我想将这些内容转换为',' text'而是表。例如

item,  reason  , problem      , cause           , disposition
0001,  null    , broken widget, unknown         , null
0002,  returned, null         , customer unhappy, in transit

item, topic      , text
0001, problem    , broken widget
0001, cause      , unknown
0002, reason     , returned
0002, cause      , customer unhappy
0002, disposition, in transit

所以,我正在摆弄一个精选查询,这是我到目前为止所得到的:

SELECT item, problem AS 'text', 'problem' AS 'topic' FROM my_table
    WHERE problem IS NOT NULL;

我将如何添加下一个类别?像

SELECT item, cause AS 'text', 'cause' AS 'topic' FROM my_table
    WHERE cause IS NOT NULL;

1:我如何将其添加到上一个select语句中,以便它涵盖'原因'和'问题'?

2:既然有这么多类别,有没有办法避免手工劳动,并以某种方式迭代字段名称?

2 个答案:

答案 0 :(得分:1)

您可以使用UNION ALL

SELECT item, problem AS text, 'problem' AS topic
FROM my_table
WHERE problem IS NOT NULL
UNION  ALL
SELECT item, cause AS text, 'cause' AS topic 
FROM my_table
WHERE cause IS NOT NULL;

为了节省构建查询的时间,您可以使用INFORMATION_SCHEMA列出列:

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='my_table';

将查询与COLUMN_NAME连接起来,或者只是将列名列表粘贴到Excel中,然后在那里构建查询并复制/删除。

答案 1 :(得分:1)

您需要非常小心在查询中使用单引号。一个简单的规则:对字符串和日期常量使用单引号。否则,转义字符是反引号 - 如果您正确命名列和表,则不需要它。

所以这个查询:

SELECT item, cause AS 'text', 'cause' AS 'topic'
FROM my_table
WHERE cause IS NOT NULL;

应该是:

SELECT item, cause AS text, 'cause' AS topic
FROM my_table
WHERE cause IS NOT NULL;

然后,您可以使用union all

组合这些内容
SELECT item, problem AS text, 'problem' AS topic FROM my_table WHERE problem IS NOT NULL UNION ALL
SELECT item, cause AS text, 'cause' AS topic FROM my_table WHERE cause IS NOT NULL

并且,您可以继续为要包含的所有列添加子查询。

编辑:

如果您想使用information_schema.columns执行此操作,可以使用replace

select replace('SELECT item, <colname> AS text, ''<colname>'' AS topic FROM my_table WHERE problem IS NOT NULL UNION ALL',
               '<colname>', column_name)
from information_schema.columns c
where table_name = XXX and
      column_name <> 'item';