2016-02-26 81 views
1

所以我需要的是得到一个对象的最便宜的价格。可以有n个价格,价格可以是周价格或日价格。无论是一天还是一周的价格,我都需要最便宜的价格。我试着用下面的查询。但是我也得到了一些NULL行。其次,如果一天的价格是最便宜的,那么我需要那一天的价格,而不是7的倍数,就像我下面的查询那样。MySQL最便宜的价格查询

所以下面的数据应该得到我这两个目标搜索时:

id | oid | price | type (day or week) 
------------------------------------- 
2 | 1 | 65 | w 
3 | 2 | 9  | d 

我希望这是可以理解的。谢谢你的帮助!


的对象表:

id | title 
----------- 
1 | Object 1 
2 | Object 2 

价格表:

| oid | price | type (day or week) 
---------------------------------- 
| 1 | 10 | d 
| 1 | 65 | w 
| 2 | 9  | d 
| 2 | 70 | w 

我的查询:

SELECT o.id, p.oid, p.price, p.type 
FROM objects AS o  
LEFT JOIN prices AS c ON p.oid= o.id 
AND p.price = 
(
SELECT MIN(IF(type="w",price, price*7)) FROM prices 
WHERE oid= o.id 
) 
LEFT JOIN ... 
LEFT JOIN ... 
WHERE ... 
GROUP BY o.id ORDER BY p.price ASC 

回答

0

添加

AND price IS NOT NULL 

在您的第一个SELECT中的WHERE子句中,将删除空值。

+0

的话,我没有得到的结果在所有的一些对象 – Mike

+0

更新中...但它取决于NULL是否在您的表中或来自JOIN –

+0

它取决于IF语句以及价格表中的日/周价格的顺序。这表明整体错误的查询。价格的顺序应该没有关系。 – Mike

1

要避免NULL行,您应该使用内连接而不是左连接。

对于你的第二部分,我没有很好地理解你想要做什么。

编辑:尝试此查询:

select p.id, o.id, p.price, p.type 
    from price as p 
    inner join object as o 
    on p.id_object = o.id 
    where if (p.type = "w", price, price * 7) <= (
    select min(if(p.type = "w", price, price *7)) 
    from price 
    where id_object = o.id 
) 
    order by p.price asc; 
+0

如果我使用内连接,我根本没有得到一些对象的结果 – Mike

0

编辑答案:

SELECT o.id, p.price, p.type 
FROM objects AS o  
LEFT JOIN prices p ON p.oid= o.id 
AND IF(p.type="w",p.price, p.price*7) <= 
(
SELECT MIN(IF(p2.type="w",p2.price, p2.price*7)) FROM prices p2 
WHERE p2.oid= o.id 
) 
.... 
+0

如果他们是最便宜的,这将不会得到我的日价格。 – Mike

+0

只是编辑了答案。我在引用子查询表时完全错误。 –

+0

这看起来不错,但我有些情况下,即使周价更便宜,我也会得到一天的价格。 – Mike