SQL自连接,包含不同日期的数据比较

时间:2015-01-15 15:31:52

标签: mysql sql self-join cross-product

我需要在SQL中比较数据 两天。我真的需要在一个查询中,因为我需要在分页中使用结果。问题是,当我正在进行自我加入时,会导致重复列,因为INNER JOIN是笛卡尔积。

sql fiddle上的

Here's the code

E.g。

SELECT * FROM `my_table` as t1 
INNER JOIN my_table t2 ON t1.quality = t2.quality
WHERE (
  t1.day = '2015-01-08' OR t1.day = '2015-01-09' OR 
  t2.day = '2015-01-08' OR t2.day = '2015-01-09'
)

两个问题:

  1. 如何重写每个JOIN的质量获得一行?
  2. 如果其中一天缺少某些相应的行(质量),它是否仍然可以使用?
  3. 修改

    这是输入:

    INSERT INTO my_table
    (quality, quantity, day)
    VALUES
    ('A', 1, '2015-01-15'),
    ('B', 2, '2015-01-15'),
    ('B', 0, '2015-01-10');
    

    所需的输出是:

    QUALITY  | QUANTITY  | T1.QUANTITY - T2.QUANTITY
    A           1          0 (or NULL?)
    B           2          2
    

    说明:

    每个日期都有唯一值。所以我们只看到A和B的质量。对于B-,在另一个日期有适当的B.对于A - 没有。因此B的差异是2(更高的日期减去更低)。 A的差异为0,因为没有什么可以减去。

1 个答案:

答案 0 :(得分:1)

您正在获取重复的列,因为您拥有它,您正在从T1和T2查询。因此,除非您明确说明只显示T1。*它将从BOTH表别名引用中获取列。

由于您的查询在日期上进行了OR,因此您可能也会获得笛卡尔结果。

现在知道你的表结构了,但是你可能会更好地使用像...这样的显式查询。

SELECT
      t1.day,
      t2.day as OtherDay,
      t1.quality,
      t1.anotherColumn,
      t2.OtherAnotherColumn,
      t1.thirdColumn,
      t2.OtherThirdColumn
   FROM 
      my_table t1
         join my_table t2
            on t1.quality = t2.quality
           AND t2.day = '2015-01-09'
   where
      t1.day = '2015-01-08' 

在你的" my_table"上有一个索引基于(日,质量)来优化查询。你可以继续成对添加,你想要在第1天和第2天之间比较的列。 T1将仅返回与第一天相关联的那些,并且T2别名将仅显示第二个日期的匹配条目。

现在,如果T1侧只有条目没有相应的质量和日期的T2条目,但你仍然希望看到这些条目,那么只需将JOIN更改为LEFT JOIN。