1. 程式人生 > 資料庫 >MySQL 多表關聯一對多查詢實現取最新一條資料的方法示例

MySQL 多表關聯一對多查詢實現取最新一條資料的方法示例

本文例項講述了MySQL 多表關聯一對多查詢實現取最新一條資料的方法。分享給大家供大家參考,具體如下:

MySQL 多表關聯一對多查詢取最新的一條資料

遇到的問題

多表關聯一對多查詢取最新的一條資料,資料出現重複

由於歷史原因,表結構設計不合理;產品告訴我說需要匯出客戶資訊資料,需要匯出客戶的 所屬行業納稅性質 資料;但是這兩個欄位卻在訂單表裡面,每次客戶下單都會要求客戶填寫;由此可知,客戶資料和訂單資料是一對多的關係;那這樣的話,問題就來了,我到底以訂單中的哪一條資料為準呢?經過協商後一致同意以最新的一條資料為準;

資料測試初始化SQL指令碼

DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (
	`id` BIGINT NOT NULL COMMENT '客戶ID',`real_name` VARCHAR(20) NOT NULL COMMENT '客戶名字',`create_time` DATETIME NOT NULL COMMENT '建立時間',PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET = UTF8 COMMENT '客戶資訊表';

-- DATA FOR TABLE customer
INSERT INTO `demo`.`customer` (`id`,`real_name`,`create_time`) VALUES ('7717194510959685632','張三','2019-01-23 16:23:05');
INSERT INTO `demo`.`customer` (`id`,`create_time`) VALUES ('7718605481599623168','李四',`create_time`) VALUES ('7720804666226278400','王五',`create_time`) VALUES ('7720882041353961472','劉六',`create_time`) VALUES ('7722233303626055680','寶寶',`create_time`) VALUES ('7722233895811448832','小寶',`create_time`) VALUES ('7722234507982700544','大寶',`create_time`) VALUES ('7722234927631204352','二寶',`create_time`) VALUES ('7722235550724423680','小賤',`create_time`) VALUES ('7722235921488314368','小明',`create_time`) VALUES ('7722238233975881728','小黑',`create_time`) VALUES ('7722246644138409984','小紅',`create_time`) VALUES ('7722318634321346560','阿狗',`create_time`) VALUES ('7722318674321346586','阿嬌',`create_time`) VALUES ('7722318974421546780','阿貓','2019-01-23 16:23:05');


DROP TABLE IF EXISTS `order_info`;
CREATE TABLE `order_info` (
	`id` BIGINT NOT NULL COMMENT '訂單ID',`industry` VARCHAR(255) DEFAULT NULL COMMENT '所屬行業',`nature_tax` VARCHAR(255) DEFAULT NULL COMMENT '納稅性質',`customer_id` VARCHAR(20) NOT NULL COMMENT '客戶ID',PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET = UTF8 COMMENT '訂單資訊表';

-- DATA FOR TABLE order_info
INSERT INTO `demo`.`order_info` (`id`,`industry`,`nature_tax`,`customer_id`,`create_time`) VALUES ('7700163609453207552','餐飲酒店類','小規模','7717194510959685632','2019-01-23 16:54:25');
INSERT INTO `demo`.`order_info` (`id`,`create_time`) VALUES ('7700163609453207553','2019-01-23 17:09:53');
INSERT INTO `demo`.`order_info` (`id`,`create_time`) VALUES ('7700167995646615552','高新技術','一般納稅人','7718605481599623168',`create_time`) VALUES ('7700167995646615553','商貿',`create_time`) VALUES ('7700193633216569344','7720804666226278400',`create_time`) VALUES ('7700193633216569345',`create_time`) VALUES ('7700197875671179264','7720882041353961472',`create_time`) VALUES ('7700197875671179266',`create_time`) VALUES ('7703053372673171456','7722233303626055680',`create_time`) VALUES ('7703053372673171457',`create_time`) VALUES ('7709742385262698496','服務類','7722233895811448832',`create_time`) VALUES ('7709742385262698498',`create_time`) VALUES ('7709745055683780608','7722234507982700544',`create_time`) VALUES ('7709745055683780609','進出口',`create_time`) VALUES ('7709745249439653888','文化體育','7722234927631204352','2019-01-24 16:54:25');
INSERT INTO `demo`.`order_info` (`id`,`create_time`) VALUES ('7709745249439653889',`create_time`) VALUES ('7709745453266051072','7722235550724423680',`create_time`) VALUES ('7709745453266051073',`create_time`) VALUES ('7709745539848413184','科技','7722235921488314368',`create_time`) VALUES ('7709745539848413185',`create_time`) VALUES ('7709745652603887616','7722238233975881728',`create_time`) VALUES ('7709745652603887617',`create_time`) VALUES ('7709745755528568832','7722246644138409984',`create_time`) VALUES ('7709745755528568833','教育諮詢',`create_time`) VALUES ('7709745892539047936','7722318634321346560',`create_time`) VALUES ('7709745892539047937',`create_time`) VALUES ('7709746000127139840','生產類','7722318674321346586',`create_time`) VALUES ('7709746000127139841','農業',`create_time`) VALUES ('7709746447445467136','7722318974421546780',`create_time`) VALUES ('7709746447445467137','2019-01-23 17:09:53');

  • 按需求寫的SQL語句:
UPDATE order_info SET create_time = NOW();
  • 嘗試解決問題
SELECT
	cr.id,cr.real_name,oi.industry,oi.nature_tax
FROM
	customer AS cr
LEFT JOIN (
	SELECT a.industry,a.nature_tax,a.customer_id,a.create_time FROM order_info AS a
	LEFT JOIN (
		SELECT MAX(create_time) AS create_time,customer_id FROM order_info GROUP BY customer_id
	) AS b ON a.customer_id = b.customer_id
WHERE a.create_time = b.create_time
) AS oi ON oi.customer_id = cr.id
GROUP BY cr.id;

資料重複嘛,小意思,加個 GROUP BY 不就解決了嗎?我怎麼會這麼機智,哈哈哈!!!但是當我執行完SQL的那一瞬間,我又懵逼了,查詢出來的結果中 所屬行業納稅性質 仍然不是最新的;看來是我想太多了,還是老老實實的解決問題吧。。。

  • 找出重複資料
SELECT
	cr.id,customer_id FROM order_info GROUP BY customer_id
	) AS b ON a.customer_id = b.customer_id
WHERE a.create_time = b.create_time
) AS oi ON oi.customer_id = cr.id
GROUP BY cr.id HAVING COUNT(cr.id) >= 2;
  • 執行結果如下:
SELECT
	cr.id,a.create_time FROM order_info AS a
	LEFT JOIN (
		SELECT MAX(id) AS id,customer_id FROM order_info GROUP BY customer_id
	) AS b ON a.customer_id = b.customer_id
WHERE a.id = b.id
) AS oi ON oi.customer_id = cr.id;

哎,終於解決了。。。

更多關於MySQL相關內容感興趣的讀者可檢視本站專題:《MySQL查詢技巧大全》、《MySQL事務操作技巧彙總》、《MySQL儲存過程技巧大全》、《MySQL資料庫鎖相關技巧彙總》及《MySQL常用函式大彙總》

希望本文所述對大家MySQL資料庫計有所幫助。