需要帮助MySQL比较查询

时间:2017-01-03 15:06:15

标签: mysql select

新年快乐!

我在创建MySQL查询以比较某些数据库条目时遇到了一些问题。

有一个名为price的表格如下:

{id,timestamp,item,priceCustomer1,priceCustomer2,priceCustomer3}

样本值:

{1,1483453891,"Paper A",2.99,2.70,1.90}
{2,1483453891,"Paper B",1.99,1.70,2.90}
{3,1483453891,"Paper C",4.99,3.70,3.90}
{4,1483453704,"Paper A",2.80,2.70,1.90}
{5,1483453704,"Paper B",1.90,1.75,2.90}
{6,1483453704,"Paper C",4.99,3.70,3.90}

在时间戳上可识别的不同时刻的不同商品的价格信息。 查询应比较最后两个时间戳中每个项目的三个价格,并列出至少一个价格不同的所有条目。

我的目标能理解吗?

我尝试过很多陈述,但现在我很绝望,不知道下次要做什么。

如果有人能帮助我,那将是非常好的。

非常感谢! 问候

编辑:

感谢您的快速回复!获取我尝试的最后两个时间戳的第一个查询就是这个:

SELECT date FROM prices GROUP BY date ORDER BY date DESC limit 2; 

由于mysql控制台上的try&错误,我尝试过的其他查询现在还没有。 我希望样本数据的结果如下:

{1,1483453891,"Paper A",2.99} 
{4,1483453704,"Paper A",2.80}  
{2,1483453891,"Paper B",1.99,1.70} 
{5,1483453704,"Paper B",1.90,1.75} 

2 个答案:

答案 0 :(得分:1)

感谢你的想法xQbert ......我想我找到了解决方案:

CREATE VIEW oldData AS
SELECT * 
FROM prices 
WHERE date= (SELECT date FROM prices GROUP BY date ORDER BY date DESC LIMIT 2     OFFSET 1);

CREATE VIEW newData AS
SELECT * 
FROM prices 
WHERE date= (SELECT date FROM prices GROUP BY date ORDER BY date DESC LIMIT 1);

SELECT * 
FROM olddata JOIN newdata USING(item) 
WHERE (olddata.priceCustomer1 <> newdata.priceCustomer1) 
OR (olddata.priceCustomer2 <> newdata.priceCustomer2)
OR (olddata.priceCustomer3 <> newdata.priceCustomer3);

我认为这会产生结果,我需要。谢谢!

答案 1 :(得分:0)

如果该项目可能在两个日期都不存在......那么您可能需要模拟完整的外部联接并使用左/右联接和联合

SELECT * FROM (
SELECT * 
FROM (SELECT * 
      FROM prices 
      WHERE date= (SELECT date 
                   FROM prices 
                   GROUP BY date 
                   ORDER BY date DESC LIMIT 2 OFFSET 1)) oldData
LEFT JOIN (SELECT * 
           FROM prices 
           WHERE date= (SELECT date 
                        FROM prices 
                        GROUP BY date 
                        ORDER BY date DESC LIMIT 1)) newData
 USING(item) 
WHERE (olddata.priceCustomer1 <> newdata.priceCustomer1) 
   OR (olddata.priceCustomer2 <> newdata.priceCustomer2)
   OR (olddata.priceCustomer3 <> newdata.priceCustomer3)
   OR newData.item is null
SELECT * 
FROM (SELECT * 
      FROM prices 
      WHERE date= (SELECT date 
                   FROM prices 
                   GROUP BY date 
                   ORDER BY date DESC LIMIT 2 OFFSET 1)) oldData
RIGHT JOIN (SELECT * 
           FROM prices 
           WHERE date= (SELECT date 
                        FROM prices 
                        GROUP BY date 
                        ORDER BY date DESC LIMIT 1)) newData
 USING(item) 
WHERE (olddata.priceCustomer1 <> newdata.priceCustomer1) 
   OR (olddata.priceCustomer2 <> newdata.priceCustomer2)
   OR (olddata.priceCustomer3 <> newdata.priceCustomer3)
   OR oldData.item is null
)