Mysql 复杂选择

Mysql 复杂选择,mysql,sql,database,Mysql,Sql,Database,也许我在这个问题上走错了方向,所以我希望能得到一些关于如何以不同方式解决这个问题的建议 我有多个MySql数据库表,其中包含50多个文本字段类别,每个类别包括原因、问题、原因、处置。。。等等,其中有些是空的,有些不是空的,这取决于它们所描述的项目 我想将它们转换为“主题”、“文本”表。比如说 item, reason , problem , cause , disposition 0001, null , broken widget, unknown

也许我在这个问题上走错了方向,所以我希望能得到一些关于如何以不同方式解决这个问题的建议

我有多个MySql数据库表,其中包含50多个文本字段类别,每个类别包括原因、问题、原因、处置。。。等等,其中有些是空的,有些不是空的,这取决于它们所描述的项目

我想将它们转换为“主题”、“文本”表。比如说

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

因此,我正在处理一个select查询,这是我目前得到的结果:

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:既然有这么多的类别,有没有办法避免这里的手工劳动并以某种方式迭代字段名?

您可以使用UNION ALL:

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

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='my_table';
要么将查询与列名连接起来,要么将列名列表粘贴到Excel中,然后在那里构建查询并进行复制/下传。

在查询中使用单引号时需要非常小心。一个简单的规则是:字符串和日期常量只使用单引号。否则,转义字符就是反勾号——如果列和表的名称正确,则不需要这样做

所以这个查询:

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组合这些选项:

而且,您可以通过这种方式继续为所有要包含的列添加子查询

编辑:

如果要对信息_schema.columns执行此操作,可以使用替换:


我同意提议的副本中的基本问题是如何回答的,但第二个问题没有在那里解决。坦白说,如果这是一次性的事情。我将编写一个简单的脚本来实现这一点,而不是尝试用一条SQL语句来解决。这样可以很容易地将当前结构读入内存,然后根据所需结构的各个部分将行插入到新格式中。我写了一个PHP脚本来转换表。谢谢你的指点,我很感激。我最终创建了一个快速的PHP脚本,因为它最终没有那么复杂,但我非常感谢您的输入。我将选择这个作为答案,因为它彻底解释了信息。
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;
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
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';