2016-02-26 80 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