MySQL - 从多个表中选择并显示多个字段
Posted
技术标签:
【中文标题】MySQL - 从多个表中选择并显示多个字段【英文标题】:MySQL - Select from multiple tables and display multiple fields 【发布时间】:2021-11-28 09:15:02 【问题描述】:我有一个 WordPress 多站点,有 100 个 *_options
表,即 WPM_101_options
到 WPM_201_options
。
我正在尝试查询选项名称admin_email
、siteurl
和blogname
。
此代码适用于 1 个表:
SELECT option_name, option_value
FROM wpm_104_options
WHERE option_name = 'admin_email'
UNION
SELECT option_name, option_value
FROM wpm_104_options
WHERE option_name = 'siteurl'
UNION
SELECT option_name, option_value
FROM wpm_104_options
WHERE option_name = 'blogname'
但是如何让它与多个表一起工作? 我尝试了 2 张桌子...
SELECT option_name, option_value
FROM wpm_104_options,wpm_105_options
WHERE option_name = 'admin_email'
UNION
SELECT option_name, option_value
FROM wpm_104_options,wpm_105_options
WHERE option_name = 'siteurl'
UNION
SELECT option_name, option_value
FROM wpm_104_options,wpm_105_options
WHERE option_name = 'blogname'
和
SELECT option_name, option_value
FROM wpm_104_options,wpm_101_options
WHERE option_name = 'admin_email'
GROUP BY option_name
UNION
SELECT option_name, option_value
FROM wpm_104_options,wpm_101_options
WHERE option_name = 'siteurl'
GROUP BY option_name
UNION
SELECT option_name, option_value
FROM wpm_104_options,wpm_101_options
WHERE option_name = 'blogname'
GROUP BY option_name
和
SELECT wpm_104_options.option_name as n104, wpm_104_options.option_value as v104, wpm_101_options.option_name as n101, wpm_101_options.option_value as v101
FROM wpm_104_options, wpm_101_options
WHERE option_name = 'admin_email'
...但我得到一个错误:
错误代码:1052。字段列表中的列 'option_name' 不明确 0.000 秒
【问题讨论】:
【参考方案1】:错误表明您尝试查询两个表,每个表都有一个 option_name
列,而数据库无法知道您指的是哪两个表。
通过在FROM
子句中指定两个表,您所做的是implicit join。如果您希望将两个表中的列加入结果中,则需要通过在它们前面加上表名来指定您所指的列,例如
SELECT wpm_104_options.option_name, wpm_104_options.option_value, wpm_101_options.option_name, wpm_101_options.option_value
FROM wpm_104_options,wpm_101_options
WHERE wpm_104_options.option_name = 'admin_email'
GROUP BY wpm_104_options.option_name
但是,这通常只有在您还指定列应该以哪种方式连接时才有意义,即在 WHERE
子句中定义它们的关系。否则,您只会从两个表中获得所有可能的行组合。
我猜你真正想要的是别的东西。我相信您只是想要为一张表显示的查询的组合结果,但来自两张表。您无法通过 FROM
子句中的两个表的隐式连接来实现这一点,而是像您已经使用的那样使用 UNION
或 UNION ALL
。例如
SELECT option_name, option_value
FROM wpm_104_options
WHERE option_name = 'admin_email'
UNION
SELECT option_name, option_value
FROM wpm_104_options
WHERE option_name = 'siteurl'
UNION
SELECT option_name, option_value
FROM wpm_104_options
WHERE option_name = 'blogname'
UNION
SELECT option_name, option_value
FROM wpm_101_options
WHERE option_name = 'admin_email'
UNION
SELECT option_name, option_value
FROM wpm_101_options
WHERE option_name = 'siteurl'
UNION
SELECT option_name, option_value
FROM wpm_101_options
WHERE option_name = 'blogname'
您也可以通过在WHERE
子句中使用OR
指定不同的条件来大大缩短此时间:
SELECT option_name, option_value
FROM wpm_104_options
WHERE option_name = 'admin_email'
OR option_name = 'siteurl'
OR option_name = 'blogname'
UNION
SELECT option_name, option_value
FROM wpm_101_options
WHERE option_name = 'admin_email'
OR option_name = 'siteurl'
OR option_name = 'blogname'
甚至
SELECT option_name, option_value
FROM wpm_104_options
WHERE option_name IN ('admin_email', 'siteurl', 'blogname')
UNION
SELECT option_name, option_value
FROM wpm_101_options
WHERE option_name IN ('admin_email', 'siteurl', 'blogname')
【讨论】:
感谢查看该链接! 我添加了很多联合......UNION All
事实上,我想保留重复的字段条目以上是关于MySQL - 从多个表中选择并显示多个字段的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 将多个表中的特定字段导出到一个 csv 文件中?创建表输出