【问题标题】:How to join tables to get one row for each row of source tables?如何连接表以获得每一行源表的一行?
【发布时间】:2012-07-26 01:33:14
【问题描述】:

我在两个表中有两种不同类型的实体,只有几个公共列我想加入并按其中一个公共列排序。在结果表中,每一行应该代表一个表中的一行或另一个表中的一行。例如,对于这样的表:

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'

我发现此查询存在一些问题:

  1. 如果我了解CROSS JOIN 的工作原理,查询会很慢,因为它会遍历所有可能的苹果-橙子组合,不是吗?有没有更快的方法?

  2. IF(...) 函数看起来很难看。它们真的有必要吗?

【问题讨论】:

    标签: mysql join outer-join cross-join full-outer-join


    【解决方案1】:

    我不确定这是否可以解决您的问题。但是您可以使用联合进行类似的输出。相对而言,union 会比 Cross join 快。

    【讨论】:

    • 谢谢,这正是我一直试图用JOINs 发明的那种轮子 :)
    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2018-07-20
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    相关资源
    最近更新 更多