2014-03-06 39 views
2

我希望有人能幫助我。 我看了其他線程,但我無法找到正確的答案。使用MAX進行mysql查詢

我有一個MySQL數據庫具有以下數據:

id, company, datefrom, dateto, rate, point1, point2 

1, DHL, 2014-03-01, 2014-03-31, $1000, Paris, New York 

2, MRW, 2014-03-01, 2014-03-31, $1300, Paris, New York 

3, EXP, 2014-03-01, 2014-03-31, $1000, Paris, New York 

4, DHL, 2014-03-06, 2014-03-31, $900, Paris, New York 

5, FED, 2014-03-01, 2014-03-31, $1200, Paris, New York 

我需要做的地方,根據日期查詢,這將只顯示該日起有效的利率。 例如,如果今天是2014年3月6日,我需要的結果是:

2, MRW, 2014-03-01, 2014-03-31, $1300, Paris, New York 

3, EXP, 2014-03-01, 2014-03-31, $1000, Paris, New York 

4, DHL, 2014-03-06, 2014-03-31, $900, Paris, New York 

5, FED, 2014-03-01, 2014-03-31, $1200, Paris, New York 

正如你所看到的,記錄1也不會顯示爲記錄4替換記錄1爲2014年3月6日

我曾嘗試以下查詢,它的工作:

SELECT id, company, MAX(datefrom), dateto, rate, point1, point2 FROM mydatabase 
WHERE datefrom<='2014-03-06' and datefrom>='2014-03-06' 
AND point1='Paris' AND point2='New York' GROUP BY company, point1, point2 

這個查詢只是它選擇了所有企業的偉大工程,但對於DHL,它從記錄1,但datefrom從記錄4選擇所有的領域!

我在做什麼錯?

+0

這個問題是問的每一天在SO(通常correctky回答),所以看看周圍。 – Strawberry

+0

你在做什麼錯了 - 混合分組列與非選擇組中。它在普通的SQL中無效。然而,MySQL允許這種行爲,但在這種情況下可以自由選擇任何行。您應該只選擇將行分組爲子查詢,然後將結果與原始表結合起來 –

+0

完全正常 - 記錄號4具有最新日期,因爲MAX將從整個表中取最大值。所以你查詢會在每一行中放入相同的值。 – Rolice

回答

1

使用MySQL的非標準分組支持:

SELECT * FROM (
    SELECT * FROM mydatabase 
    WHERE '2014-03-06' BETWEEN datefrom AND dateto 
    AND point1 = 'Paris' 
    AND point2 = 'New York' 
    ORDER BY datefrom DESC) x 
GROUP BY company 

該作品以第一順序相匹配最新的啓動行範圍首先在內部查詢,然後通過並非所有非聚合列編組, mysql爲company的每個唯一值選擇第一行行,第一行是您想要的行(先前已被排序)。

還要注意條件的改造使用BETWEEN這是更優雅。

+0

很好,謝謝波希米亞人,你的代碼很棒。就是我以後的樣子。只是一個問題,x做了什麼? (在DESC末尾)x) – user1135218

+0

'x'是內部查詢的* alias *,並且在從內部查詢的結果中選擇時需要指定別名,即使別名未被引用至。你可以使用任何你喜歡的名字,但是我喜歡使用'x',因爲它簡短而神祕 – Bohemian

0

您需要在當前記錄datefrom之後添加不存在記錄的條件與datefrom

select * from mydatabase t1 

WHERE '2014-03-06' between datefrom and dateto 
AND NOT EXISTS 
(
    select 1 from mydatabase 
    where company=t1.company 
    AND point1 = t1.point1 
    AND point2 = t1.point2 
    AND '2014-03-06' between datefrom and dateto 
    AND datefrom>t1.datefrom 
) 

SQLFiddle demo