外连接两个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 join
或left outer join
或right 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的主要内容,如果未能解决你的问题,请参考以下文章