我需要在SQL中比较数据 两天。我真的需要在一个查询中,因为我需要在分页中使用结果。问题是,当我正在进行自我加入时,会导致重复列,因为INNER JOIN
是笛卡尔积。
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'
)
两个问题:
修改
这是输入:
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,因为没有什么可以减去。
答案 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。