Mysql

如何顯示沒有 DUPLICATE 和 ORDER by MAX DATE 的日期

  • August 1, 2019

我只是想問一下如何顯示空值以及 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.5sql_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');

引用自:https://dba.stackexchange.com/questions/244087