MySQL - 从多个表中选择并显示多个字段

Posted

技术标签:

【中文标题】MySQL - 从多个表中选择并显示多个字段【英文标题】:MySQL - Select from multiple tables and display multiple fields 【发布时间】:2021-11-28 09:15:02 【问题描述】:

我有一个 WordPress 多站点,有 100 个 *_options 表,即 WPM_101_optionsWPM_201_options

我正在尝试查询选项名称admin_emailsiteurlblogname

此代码适用于 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 子句中的两个表的隐式连接来实现这一点,而是像您已经使用的那样使用 UNIONUNION 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选择相关表中有多个匹配记录的记录

MYSQL过滤表中某几个字段重复的数据

MySQL 将多个表中的特定字段导出到一个 csv 文件中?创建表输出

选择不存在于具有多个字段的同一个表中

使用 PHP 选择并显示 MySQL 表中的所有字段以获取无限量的列

MYSQL查一个字段中 多个值