我在两个表中有两种不同的实体,只有几个常见的列我想要连接并按其中一个公共列排序。在结果表中,每一行应表示一个表中的行或另一个表中的行。例如,对于这样的表:
CREATE TABLE apple (
apple_id INT NOT NULL AUTO_INCREMENT,
acquired DATETIME NOT NULL,
is_fresh TINYINT,
PRIMARY KEY (apple_id)
);
'1', '2012-07-27 19:06:58', '1'
'2', '2012-07-28 18:05:43', '0'
CREATE TABLE orange (
orange_id INT NOT NULL AUTO_INCREMENT,
acquired DATETIME NOT NULL,
is_yummy TINYINT,
PRIMARY KEY (orange_id)
);
'1', '2012-06-12 10:03:31', '0'
'2', '2012-08-30 22:00:02', '1'
我加入查询的想法是这样的:
SELECT
IF(orange_id IS NULL, 'apple', 'orange') AS type,
IF(orange_id IS NULL, apple.acquired, orange.acquired) AS acquired,
is_fresh,
is_yummy
FROM apple CROSS JOIN orange ON apple_id IS NULL OR orange_id IS NULL
ORDER BY acquired ASC
'orange', '2012-06-12 10:03:31', NULL, '0'
'apple', '2012-07-27 19:06:58', '1', NULL
'apple', '2012-07-28 18:05:43', '0', NULL
'orange', '2012-08-30 22:00:02', NULL, '1'
我发现此查询存在一些问题:
如果我理解CROSS JOIN
是如何工作的,那么查询将非常缓慢,因为它会经历所有可能的苹果 - 橙色组合,不是吗?有更快的方法吗?
IF(...)
函数看起来很难看。他们真的有必要吗?
答案 0 :(得分:1)
我不确定这是否是您问题的解决方案。但是你可以使用union来制作类似的输出。相比,加入会比加入更快。