2017-09-25 43 views
-1

的日期和max這是我當前的SQL查詢:組由一個版本查詢錯誤

SELECT `room_id`, `target_date`, `rate_per_room`, `max_room`, MAX(`version`) 
    FROM `t0311_room_rate` 
     WHERE `room_id` = ? 
      AND `target_date` >= ? 
      AND `target_date` is not null 
      GROUP BY `target_date` 
      ORDER BY `target_date` 

這些都是我的樣本數據

enter image description here

我應該得到三個記錄,如果我查詢target_date > =今天,其中的確如此。 但是,版本和rate_per_room不相符。例如版本12的 ,我應該得到195,但我得到了190。

在我的查詢中是否有遺漏任何部分?

謝謝

+0

'SELECT'room_id','target_date','rate_per_room','max_room' ... GROUP BY'target_date'無效SQL .. MySQL可以爲未在GR中命名的列返回隨機結果OUP BY ...閱讀https://www.psce.com/zh/blog/2012/05/15/mysql-mistakes-do-you-use-group-by-correctly/ –

+0

您的查詢沒有意義。它不應該跑。 rate_per_room的哪個值將會被target_date 2017-10-01拾取? – Eric

回答

1

聽起來像是你想要的MAX(rate_per_room)。您還應該將您的其他非聚合列添加到您的GROUP BY。大多數RDBMS會讓你這樣做,但MySQL是'特殊'的。

SELECT `room_id`, `target_date`, MAX(`rate_per_room`), `max_room`, MAX(`version`) 
FROM `t0311_room_rate` 
WHERE `room_id` = ? 
AND `target_date` >= ? 
AND `target_date` is not null 
GROUP BY `room_id`, `target_date`, `max_room` 
ORDER BY `target_date` 

編輯:

由於MAX(version)不會總是與MAX(rate_per_room)匹配,你應該得到的MAX(version)第一,然後JOIN回表的其他數據:

SELECT b.room_id, b.target_date, b.rate_per_room, b.max_room, a.version 
FROM (SELECT room_id, MAX(Version) as version 
     FROM t0311_room_rate 
     GROUP BY room_id) a 
INNER JOIN t0311_room_rate b on a.room_id = b.room_id 
          and a.version = b.version 
--Add filters as desired 
ORDER BY target_date 
+0

我仍然無法獲得每個日期的最大版本的rate_per_room。 該版本是正確的,但rate_per_room是不正確的.. –

+0

@BrianRuchiadi我誤以爲你想要每列的最大值。查看我的編輯,通過這種方式,您可以識別每個房間的「最大(版本)」,然後回到表格以獲取與「最大(版本)」關聯的所有數據。 –