【问题标题】:MySQL - Select from multiple tables and display multiple fieldsMySQL - 从多个表中选择并显示多个字段
【发布时间】: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 秒

【问题讨论】:

    标签: mysql sql join select union


    【解决方案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 事实上,我想保留重复的字段条目
    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 2015-08-24
    • 2013-02-24
    • 1970-01-01
    • 2016-05-25
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多