-1

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

这是sql fiddle上的代码

例如

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. 我如何重写 go get one row per JOIN on quality?
  2. 如果某一天缺少一些相应的行(关于质量),它仍然有效吗?

编辑

这是输入:

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,因为没有什么可减去的。

4

1 回答 1

1

你得到重复的列,因为你有它,你从 T1 和 T2 查询。因此,除非您明确说只显示 T1.*,否则它将从两个表别名引用中获取列。

由于您的查询是对日期进行 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。

于 2015-01-15T15:47:00.407 回答