首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:联合+连接

问MySQL:联合+连接
EN

Stack Overflow用户
提问于 2019-03-26 14:54:36
回答 1查看 58关注 0票数 1

我正在试图弄清楚如何将UNION与相同的JOIN一起使用,而不陷入#2014 -命令不同步。

我已经创建了四个简单的表,并为它们编写了简化的代码。主要的想法是得到每一把剑,枪和帽子,它们的名字都是‘最好的’,如果它们的主人很酷的话。

代码语言:javascript
复制
SELECT pirate_id, sword, null AS gun, null AS hat, legs = 1 AS is_cool FROM swords as t1
LEFT JOIN
(SELECT legs, pirate_id as pid FROM body_parts) AS t2
ON t1.pirate_id = t2.pid
WHERE sword LIKE '%best%'

UNION
SELECT pirate_id, null AS sword, gun, null AS hat, legs = 1 AS is_cool FROM guns as t3
LEFT JOIN
(SELECT legs, pirate_id as pid FROM body_parts) AS t4
ON t3.pirate_id = t4.pid
WHERE gun LIKE '%best%' 

UNION
SELECT pirate_id, null AS sword, null AS gun, hat, legs = 1 AS is_cool FROM hats as t5
LEFT JOIN
(SELECT legs, pirate_id as pid FROM body_parts) AS t6
ON t5.pirate_id = t6.pid
WHERE hat LIKE '%best%' 

ORDER BY is_cool DESC, pirate_id ASC

目前,每次我必须联合时,我都必须重复加入。我希望有更好的方法..。

表创建:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `body_parts` (
  `pirate_id` int(11) NOT NULL,
  `legs` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `body_parts` (`pirate_id`, `legs`) VALUES
(1, 0),
(2, 1),
(3, 2);

CREATE TABLE IF NOT EXISTS `guns` (
  `pirate_id` int(11) NOT NULL,
  `gun` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `guns` (`pirate_id`, `gun`) VALUES
(1, 'best 1');

CREATE TABLE IF NOT EXISTS `hats` (
  `pirate_id` int(11) NOT NULL,
  `hat` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `hats` (`pirate_id`, `hat`) VALUES
(2, 'best 2');

CREATE TABLE IF NOT EXISTS `swords` (
  `pirate_id` int(11) NOT NULL,
  `sword` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `swords` (`pirate_id`, `sword`) VALUES
(3, 'best 3');
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-26 15:24:16

您可以使用单个左连接来更改使用子查询

代码语言:javascript
复制
    select t1.pirate_id, t1.sword, t1.gun, t1.hat, t2.legs=1  is_cool

    from  (
        SELECT pirate_id, sword, null AS gun, null AS hat 
        FROM swords 
        WHERE sword LIKE '%best%'

        UNION 

        SELECT pirate_id, null, gun, null
        FROM guns 
        WHERE gun LIKE '%best%' 

        UNION 
        SELECT pirate_id, null, null, hat
        FROM hats 
        WHERE hat LIKE '%best%'
    ) t1  
    LEFT JOIN (
        SELECT legs, pirate_id 
        FROM body_parts
    ) t2 ON t2.pirate_id = t1.pirate_id
    ORDER BY is_cool DESC, pirate_id ASC
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55351351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档