外连接两个select语句的输出——mysql

Posted

技术标签:

【中文标题】外连接两个select语句的输出——mysql【英文标题】:Outer join the output of two select statement - mysql 【发布时间】:2013-08-13 01:18:39 【问题描述】:

我正在尝试连接两个 select 语句的输出,因为每个 select 语句都会返回 0 或 1 个输出,如果一个返回 0 输出,INNER JOIN 将不会返回任何内容。 我想知道如何完成外部连接。 我已经看到了 INNER JOIN 的解决方案,并且已经得到了这个解决方案,但是当我将它更改为 OUTER JOIN 时,我收到了这个错误:

错误代码:1064。您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 3 行的“OUTER JOIN (SELECT value FROM server_setting WHERE server_id=1 AND server_sett”附近使用正确的语法

这里是查询:

SELECT * FROM
(SELECT `value` AS url FROM server_setting WHERE server_id=1 AND server_setting_type_id=(SELECT min(id) FROM server_setting_type WHERE type='url')) AS t1
FULL OUTER JOIN
(SELECT `value` AS port FROM server_setting WHERE server_id=1 AND server_setting_type_id=(SELECT min(id) FROM server_setting_type WHERE type='port')) AS t2
;

样本输入:

server_setting 表:

|---------|----------------------|-----|
|server_id|server_setting_type_id|value|
|---------|----------------------|-----|
|1        |1                     |http |
|1        |2                     |22   |
|---------|----------------------|-----|

server_setting_type 表:

|--|----|
|id|type|
|--|----|
|1 |url |
|2 |port|
|--|----|

结果:

|----|----|
|url |port|
|----|----|
|http|22  |
|----|----|

谢谢

【问题讨论】:

什么类型的外连接?左,右,满?考虑使用Full Outer joinleft outer joinright outer join 是否要附加两个查询的结果?在这种情况下,将上面查询中的OUTER JOIN 替换为UNION。正如你现在的查询所代表的那样,如果你让它工作,它将有一行和两列名为value。如果您不想附加结果,是否可以将示例数据和预期结果添加到您的问题中? 我想做 FULL OUTER JOIN,加上 FULL 我得到了同样的错误。 @EdGibbs 实际上我想显示相邻的两个结果列,正如您所提到的,一行有两列。 【参考方案1】:

您的查询是:

SELECT *
FROM (SELECT `value` AS url
      FROM server_setting
      WHERE server_id=1 AND
            server_setting_type_id=(SELECT min(id)
                                    FROM server_setting_type
                                    WHERE type='url')
     ) AS t1 FULL OUTER JOIN
     (SELECT `value` AS port
      FROM server_setting
      WHERE server_id=1 AND
            server_setting_type_id=(SELECT min(id)
                                    FROM server_setting_type
                                    WHERE type='port')
    ) AS t2;

几件事。首先,MySQL 不支持 full outer join (这是您得到错误的地方。其次,您没有 on 子句。第三,server_setting_type 表会有多行用于“端口”和“url”。我的第一个建议是使用cross join 而不是full outer join。这可能会满足您的需求。

但是,出于某种原因,我认为以下内容可能更接近您真正想要的:

      SELECT sst_url.value as url, sst_port.`value` AS port
      FROM server_setting ss left outer join
           server_setting_type sst_url
           on ss.server_setting_type_id = sst_port.id and
              sst.type = 'url' left outer join
           server_setting_type sst_port
           on ss.server_setting_type_id = sst_port.id and
              sst.type = 'port'
      where ss.server_id = 1;

此版本确实假定server_setting_type 中只有一个id 用于“url”,一个用于“port”。这对我来说似乎很合理。

【讨论】:

以上是关于外连接两个select语句的输出——mysql的主要内容,如果未能解决你的问题,请参考以下文章

MySql表的内连和外连

mysql数据库外连

内连接,外连接,交叉连接

脱库&站库分离渗透&解决MySQL禁止外连

SQL中有几种连接?有啥区别?(左连右连内连和外连?)

SQL各种连接——自连接内连接外连接交叉连接的使用