1

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

错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以value在第 3 行的 'OUTER JOIN (SELECT 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  |
|----|----|

谢谢

4

1 回答 1

2

您的查询是:

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表将有多行用于“port”和“url”似乎真的很奇怪。我的第一个建议是做 across join而不是 a 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;

这个版本确实假设“url”只有一个idserver_setting_type“port”只有一个。这对我来说似乎很合理。

于 2013-08-11T19:22:18.690 回答