如何顯示沒有 DUPLICATE 和 ORDER by MAX DATE 的日期
我只是想問一下如何顯示空值以及 MAX 日期。
SELECT MEMB.MEMB_N, MEMB.LAST_M, PrintDate FROM MEMB INNER JOIN tblPrint ON MEMB.MEMB_N = tblPrint.MEMB_N ORDER BY tblPrint.`PrintDate` DESC
這是MySQL傳奇的另一部分。
sql_mode = only_full_group_by
<rant>
問題是 MySQL 的預設值(直到 8)將返回結果,根據被
INSERT
編輯到表中的記錄的順序(和/或PRIMARY KEY
排序),結果會有所不同,並且是正確或錯誤的 DEPENDING。這絕對是 MySQL 最典型的難以重現的最糟糕的錯誤。
<\rant>
然而,很高興看到 MySQL 的預設行為現在是正確的(在 PostgreSQL、FirebirdSQL 和主要供應商(Oracle、SQL Server 等)超過 25 年之後!!)。
您需要執行以下操作:
– 創建表 - 小提琴(這裡是 MySQL 版本 8 )
CREATE TABLE memb ( last_m VARCHAR (30), CONSTRAINT memb_pk PRIMARY KEY (last_m) );
- 和
CREATE TABLE tblprint ( last_m VARCHAR (30), printdate DATETIME NOT NULL, CONSTRAINT tp_pk PRIMARY KEY (last_m, printdate), CONSTRAINT tp_memb_fk FOREIGN KEY (last_m) REFERENCES memb (last_m) );
- 請參閱此答案的結尾以使用數據填充這些表
我添加了更多記錄,並故意以與日期不同的順序插入它們,
ASCENDING
或者DESCENDING
- 請參閱下面的討論。正確答案是
SELECT m.last_m, MAX(tp.printdate) AS "p_date" -- COALESCE(MAX(tp.printdate), '"NULL"') AS "for_display" -- optional, just for show! FROM tblprint tp RIGHT JOIN memb m ON tp.last_m = m.last_m GROUP BY last_m ORDER BY last_m, p_date;
嚴格來說,
RIGHT JOIN
應該是一個RIGHT OUTER JOIN
。結果:
last_m p_date ANDRES, JOSE 2024-07-29 13:33:24 LORISA, MARIA 2021-07-29 13:37:44 SENINA, JUSTINA TAN, LOLITA
無論記錄插入順序是什麼,這都是正確的結果。
現在,版本 5.6(可在此處獲得)有一個替代小提琴,它最接近您正在使用的 5.5。此處提供 5.5 的 dbfiddle.com 版本- 它似乎按順序任意
PRIMARY KEY
取第一個日期- 所以它選擇最小的。正如您將看到的 - MySQL 的預設值,即 5.6 版本,比 8 更寬鬆。您可以在版本 8 中看到這一點。您可以為版本 5.5
sql_mode = only_full_group_by
設置這個(強烈推薦)。我還強烈建議您升級到版本 8 - 現在已經有一段時間了。你還會發現,如果你試驗一下記錄插入順序,你會在 5.6 中得到不同的結果——例如,如果巧合的是,數據是通過 last_m 以相反的日期順序插入到
tblprinter
表中的,你將能夠得到@HiteshRathi 查詢的“正確”結果——當然這是非常危險的!我建議您“玩弄”小提琴中的各種查詢,看看會發生什麼 - 記錄插入順序和
PRIMARY KEY
順序是要考慮的因素。確保您的查詢不會返回具有不同記錄插入順序和/或PRIMARY KEY
順序的不同結果。——————– 表的數據 ————– -
INSERT INTO memb VALUES ('ANDRES, JOSE'); INSERT INTO memb VALUES ('LORISA, MARIA'); INSERT INTO memb VALUES ('SENINA, JUSTINA'); INSERT INTO memb VALUES ('TAN, LOLITA'); INSERT INTO tblprint VALUES ('ANDRES, JOSE', '2019-07-29 13:39:44'); INSERT INTO tblprint VALUES ('ANDRES, JOSE', '2001-09-01 23:33:41'); INSERT INTO tblprint VALUES ('ANDRES, JOSE', '2002-07-29 13:33:42'); INSERT INTO tblprint VALUES ('ANDRES, JOSE', '2003-07-29 13:33:43'); INSERT INTO tblprint VALUES ('ANDRES, JOSE', '2024-07-29 13:33:24'); INSERT INTO tblprint VALUES ('ANDRES, JOSE', '2020-07-29 20:20:20'); INSERT INTO tblprint VALUES ('LORISA, MARIA', '2014-07-29 13:34:44'); INSERT INTO tblprint VALUES ('LORISA, MARIA', '2007-07-29 13:31:44'); INSERT INTO tblprint VALUES ('LORISA, MARIA', '2008-07-29 13:32:44'); INSERT INTO tblprint VALUES ('LORISA, MARIA', '2009-07-29 13:33:44'); INSERT INTO tblprint VALUES ('LORISA, MARIA', '2018-07-29 13:35:44'); INSERT INTO tblprint VALUES ('LORISA, MARIA', '2021-07-29 13:37:44'); INSERT INTO tblprint VALUES ('LORISA, MARIA', '2020-07-29 13:36:44');