Mysql

Mysql基於另一列的MAX順序編號

  • May 20, 2014

我有一個表 lp_pictures 有這些欄位:

[id | plate_uid]
[1  | aaa]
[1  | aaa]
[1  | aaa]
[1  | bbb]
[1  | bbb]
[1  | bbb]

我需要將欄位 id 更新為:

[id | plate_uid]
[1  | aaa]
[2  | aaa]
[3  | aaa]
[1  | bbb]
[2  | bbb]
[3  | bbb]

表結構為:

CREATE TABLE `lp_pictures` (
 `id` int(5) NOT NULL,
 `plate_uid` varchar(128) NOT NULL,
 `uid` varchar(64) NOT NULL,
 `filename` varchar(128) NOT NULL,
 `extension` varchar(4) NOT NULL,
 `ip_submitted` varchar(15) NOT NULL,
 `date_submitted` datetime NOT NULL,
 `mode_submitted` varchar(15) NOT NULL,
 `ip_validated` varchar(15) NOT NULL,
 `date_validated` datetime NOT NULL,
 `user_validated` varchar(64) NOT NULL,
 `size` bigint(20) NOT NULL,
 `combination` varchar(9) NOT NULL,
 `type` varchar(15) NOT NULL,
 `oldtimer` tinyint(1) NOT NULL DEFAULT '0',
 `owner` tinyint(1) NOT NULL,
 `name` varchar(128) NOT NULL,
 `email` varchar(128) NOT NULL,
 `notify` tinyint(1) NOT NULL,
 `main` tinyint(1) NOT NULL,
 `source` varchar(512) NOT NULL,
 `comment` text NOT NULL,
 `meaning` text NOT NULL,
 `like` bigint(12) NOT NULL DEFAULT '0',
 `score` bigint(20) NOT NULL,
 `share` bigint(20) NOT NULL DEFAULT '0',
 `visible` tinyint(1) NOT NULL DEFAULT '1',
 `blocked` varchar(1) NOT NULL DEFAULT '0',
 `fb_post_id` varchar(128) DEFAULT NULL,
 PRIMARY KEY (`uid`)) ENGINE=MyISAM DEFAULT CHARSET=utf8

應根據 date_validated 欄位分配訂單。(降低到第一個日期)。

我需要一個 mysql UPDATE 指令。

非常感謝 !!

STEP 01 : 創建索引date_submitted

ALTER TABLE lp_pictures ADD INDEX (date_submitted);

步驟 02:創建單獨的表以對id值進行排序

CREATE TABLE lp_picture_ordering
(
   id INT NOT NULL AUTO_INCREMENT,
   plate_uid varchar(128) NOT NULL,
   uid varchar(64) NOT NULL,
   PRIMARY KEY (plate_uid,id),
   UNIQUE KEY uid (uid)
) ENGINE=MyISAM;

STEP 03 : 將表排序資訊載入到排序表中

INSERT INTO lp_picture_ordering (plate_uid,uid)
SELECT plate_uid,uid FROM lp_pictures ORDER BY date_submitted;

STEP 04 : 執行 UPDATE JOINid賦值

UPDATE lp_pictures A
INNER JOIN lp_picture_ordering B
USING (uid) SET A.id = B.id;

STEP 05 : 刪除訂購表

DROP TABLE lp_picture_ordering;

注意事項

警告 #1

您需要添加 date_submitted 索引,以便按日期排序的檢索會很快

注意事項 #2

您只需要執行一次 STEP 01

警告 #3

STEP 02 為每個 plate_uid 創建增量值。此技術僅適用於 MyISAM 儲存引擎。在我之前的文章中,我建議在多列中使用 auto_increment 列PRIMARY KEY

警告 #4

在步驟 03 中,id 值由儲存引擎生成。

警告 #5

排序表包含帶有唯一鍵的 uid,以便步驟 04 可以執行內部聯接

警告 #6

完成後,無需保留訂購表。這就是我放棄它的原因。

警告 #7

如果您需要再次執行此操作,只需執行步驟 2-5

試一試 !!!

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