2014-10-08 53 views
0

我試圖以每個酒店的每日最低價格獲取多個結果。 我首先嚐試使用MIN()函數獲取最低數量,然後使用內部連接。 當我以後嘗試通過外部子查詢進行分組時,它僅由最低的ID進行分組。 的SQL本身:MySQL GROUP BY按最低字段值分組

SELECT mt.id, mt.amount, mt.fk_hotel, mt.start_date 
FROM price mt 
INNER JOIN 
(
    SELECT price.id, MIN(price.amount) minAmount 
    FROM price 
    WHERE 1=1 AND price.start_date >= '2014-10-08' AND price.start_date <= '2014-10-10' AND price.active = 1 AND price.max_people = 2 
    GROUP BY id 
) t 
ON mt.id = t.id AND mt.amount = t.minAmount 
ORDER BY mt.fk_hotel, mt.amount; 

而結果是這樣的: http://jsfiddle.net/63mg3b2j/

我想組由開始日期和fk_hotel使其羣體由最低量的值,任何人可以幫助我嗎?我清楚了嗎?

編輯:我還需要從相應的行場fk_room,這樣我就可以內部連接

+0

如果你有一個SQL的一個問題,那麼SQLFIDDLE很可能會超過的jsfiddle – Strawberry 2014-10-08 11:14:14

回答

0

那麼首先得到使用ORDER BY然後GROUP BY與頂行中最低值的表爲您想要的結果

SELECT mt.id, mt.amount, mt.fk_hotel, mt.start_date 
FROM 
    (SELECT id, amount, fk_hotel, start_date 
    FROM price 
    WHERE start_date >= '2014-10-08' AND start_date <= '2014-10-10' 
    AND active = 1 AND max_people = 2 
    ORDER BY amount DESC) AS mt 
GROUP BY mt.id 
+0

更加有用@test:請讓我知道如果這有幫助嗎? – 2014-10-08 10:17:21

+0

沒有工作。我得到4個結果fk_hotel = 1和start_date = 2014-10-08。而身份證和金額沒有反映在DB中的正確的行(例如ID 223的數量應該是195,但我得到了175)。 – test 2014-10-08 10:21:55

+0

請添加sqlfiddle而不是jsfiddle,moroever請提供您的db的架構。我將能夠幫助你確定:) – 2014-10-08 10:24:52

0

試試這個:

SELECT MIN(mt.amount) AS min_amount, mt.fk_hotel, mt.start_date 
FROM price mt 
WHERE 
    mt.active = 1 AND 
    mt.max_people = 2 AND 
    mt.start_date >= '2014-10-08' AND mt.start_date <= '2014-10-10' 
GROUP BY mt.fk_hotel, mt.start_date 
ORDER BY mt.fk_hotel, min_amount; 
+0

這是非常接近,但問題是獲得相應的字段,可能也是有用的那一行。所以我們假設有一個fk_roomtype字段,如果我將它添加到選擇字段,它將獲取數據庫中的第一個結果值,而不是相應的那個特定數量的值。我想讓fk_roomtype在另一個表上進行內部連接。我想這需要一個子查詢?如何增強此查詢? – test 2014-10-08 11:09:17

0

好吧,我只好仍與子查詢去,因爲我需要一些額外的外鍵的字段來回回在相應的行內部加入其他一些東西。這不是一個好的解決方案,因爲它提取的東西太多了,剩下的部分被編程過濾掉了。當我嘗試使用MIN()或MAX()函數並獲取適當的字段到該行時,它從數據庫中獲取第一個結果,這是不正確的,所以我不得不使用一個子查詢到內部連接以獲得其他字段,我可以使用分組,但是我有太多的字段要分組。也許我錯過了一些東西。數據量沒有及時增長,所以我猜這對我很有用。因此,這是最後的SQL我想出了,以備將來參考..

SELECT mt.*, roomtype.name roomname, hotel.name hotelname 
FROM booking.price mt 
INNER JOIN roomtype ON roomtype.id = mt.fk_roomtype 
INNER JOIN hotel ON hotel.id = mt.fk_hotel 
INNER JOIN(    
    SELECT price.id, MIN(price.amount) minAmount 
    FROM booking.price WHERE 1=1 AND price.start_date >= '2014-10-22' AND price.start_date <= '2014-10-31' AND price.max_people = 2 AND price.active = 1 
    GROUP BY id 
) t 
ON mt.id = t.id AND mt.amount = t.minAmount 
ORDER BY mt.start_date, mt.amount