2012-03-11 51 views
2

我正在使用select field1, max(updated_date) from mytable
我得到max(updated_date)的正確值,即最大日期。
但是對於field1我剛剛得到第一條記錄的值,即「ta1」,當我真的想從第三條記錄(具有最大日期值的那條記錄)得到「ta3」值時。當我選擇MAX時更改其他列的值(updated_date)

例如

+------------+---------------------+ 
| field1  | update_date   | 
+------------+---------------------+ 
| ta1  | 2012-03-11 11:05:15 | 
| ta2  | 2012-03-11 11:05:32 | 
| ta3  | 2012-03-11 11:05:56 | 
+------------+---------------------+ 
3 rows in set (0.00 sec) 

+------------+---------------------+ 
| field1  | max(update_date) | 
+------------+---------------------+ 
| ta1  | 2012-03-11 11:05:56 | 
+------------+---------------------+ 
1 row in set (0.00 sec) 
+1

什麼是正確的價值? – 2012-03-11 18:35:47

+1

它應該是ta3。 – junky 2012-03-11 18:38:07

+0

你可以發佈整個SQL查詢嗎? – 2012-03-11 18:40:39

回答

5

您可能需要GROUP BY子句或更復雜的查詢。

SELECT field1, MAX(updated_date) 
    FROM mytable 
GROUP BY field1 

對於示例數據,這將返回3行。

更有可能的是,你想:

SELECT t1.field1, t3.max_date 
    FROM mytable AS t1 
    JOIN (SELECT MAX(t2.updated_date) AS max_date 
      FROM mytable AS t2 
     ) AS t3 
    ON t1.updated_date = t3.max_date; 

對於樣本數據,這將返回1行:

ta3 2012-03-11 11:05:56 

主要DBMS中,只有MySQL允許你省略GROUP BY子句當您在選擇列表中有聚合和非聚合列的混合時。 SQL標準需要GROUP BY子句,並且必須列出其中的所有非聚合列。有時候,在MySQL中,省略GROUP BY子句會產生你想要的答案;但儘管如此,它卻設法給出了意想不到的答案。

+0

實際上,在PostgreSQL 9.1(或更高版本)中,GROUP BY子句中列出的主鍵列涵蓋了該表的所有列。您不需要再詳細列出SELECT列表中使用的所有列。 (當然,你也不能聚合它們。) – 2012-03-11 19:05:33

+0

因此PostgreSQL知道鍵,這很好,但它仍然需要將PK列在GROUP BY子句中。所以只有MySQL允許你完全省略GROUP BY子句。我喜歡PostgreSQL的擴展;我還沒有被MySQL的說服。 – 2012-03-11 19:07:26

+0

我絕對同意。 PostgreSQL功能是一個語法上的便利,MySQL的「功能」是一個加載的footgun。 – 2012-03-11 19:09:05

3

使用ORDER BY和LIMIT。

SELECT field1, updated_date 
    FROM mytable 
ORDER BY updated_date DESC 
    LIMIT 1; 

如果需要查詢大量的你可以試試這個替代方案:

SELECT t1.field1, t1.updated_date 
    FROM mytable t1 
     LEFT JOIN mytable t2 
    AND t2.updated_date > t1.updated_date 
    WHERE t2.field1 IS NULL; 

簡短說明:
對於每一行,給我任何
然後因爲它的簡單有更近的updated_date
但是(WHERE子句)只取最近的那一行updated_date
該技術有時稱爲自排斥連接。
這是中間結果(無WHERE子句,並添加t2.*到SELECT列表):

 
ta1 2012-03-11 11:05:15 ta2  2012-03-11 11:05:32 
ta1 2012-03-11 11:05:15 ta3  2012-03-11 11:05:56 
ta2 2012-03-11 11:05:32 ta3  2012-03-11 11:05:56 
ta3 2012-03-11 11:05:56 null null 
+0

這似乎很簡單,工作正常 – cawecoy 2014-01-09 16:54:30

相關問題