2010-04-30 65 views
4

給定一個表像之下,是有一個單一查詢的方式來更新此表:是否有可以跨多個組更新「序列號」的單個查詢?

| id | type_id | created_at | sequence | 
|----|---------|------------|----------| 
| 1 |  1 | 2010-04-26 | NULL  | 
| 2 |  1 | 2010-04-27 | NULL  | 
| 3 |  2 | 2010-04-28 | NULL  | 
| 4 |  3 | 2010-04-28 | NULL  | 

對此(注意created_at用於排序和sequencetype_id「分組」):

| id | type_id | created_at | sequence | 
|----|---------|------------|----------| 
| 1 |  1 | 2010-04-26 |  1 | 
| 2 |  1 | 2010-04-27 |  2 | 
| 3 |  2 | 2010-04-28 |  1 | 
| 4 |  3 | 2010-04-28 |  1 | 

我已經看到了一些代碼,在此之前,使用如下所示的@變量,我認爲可能的工作:

SET @seq = 0; 
UPDATE `log` SET `sequence` = @seq := @seq + 1 
ORDER BY `created_at`; 

但是,顯然不會將每個type_id的序列重置爲1。

如果沒有單一查詢的方式來做到這一點,最有效的方法是什麼?

此表中的數據可能會被刪除,所以我打算在用戶完成編輯以重新排序表後運行存儲過程。

回答

5

您可以使用其他變量存儲以前的type_id(@type_id)。該查詢按type_id排序,因此只要type_id發生更改,序列就必須重新設置爲1。

Set @seq = 0; 
Set @type_id = -1; 

Update `log` 
Set `sequence` = If(@type_id=(@type_id:=`type_id`), (@seq:[email protected]+1), (@seq:=1)) 
Order By `type_id`, `created_at`; 
+0

這是非常非常聰明的東西!謝謝! – Drarok 2010-04-30 10:34:33

0

我不太瞭解MySQL,但您可以使用子查詢,雖然它可能非常慢。

UPDATE 'log' set 'sequence' = (
    select count(*) from 'log' as log2 
    where log2.type_id = log.type_id and 
    log2.created_at < log.created_at) + 1 

儘管如果兩個type_ids具有相同的created_at日期,您將會得到重複的序列。

相關問題