2017-10-14 55 views
0

我有這張表,我想把它分成三張表,所以我有名稱,名稱和訂單之間的關係表,以及第三個只包含訂單。所以,我認爲一個簡單的方法可能是在這裏補充一個唯一的編號列MYSQL:基於唯一的行值爲表添加唯一的數值?

+----+------+-----------------------+-------+--------------+ 
| id | name | address    | phone | order_number | 
+----+------+-----------------------+-------+--------------+ 
| 1 | Joe | Joes Address   | 1111 | 1390842  | 
| 2 | Paul | Pauls Address   | 2222 | 9082309  | 
| 3 | Greg | Gregs Address   | 3333 | 0928340  | 
| 4 | Lucy | Lucys Address   | 4444 | 9028340  | 
| 5 | Paul | Pauls Address   | 2222 | 8958399  | 
| 6 | Tom | Toms Address   | 5555 | 9084024  | 
| 7 | Lucy | Lucys Another Address | 4444 | 9801983  | 
| 8 | Paul | Pauls Another Address | 2222 | 0982304  | 
+----+------+-----------------------+-------+--------------+ 

,我想用獨特的name值相關聯的遞增的數字添加數字列,使該預期的結果

+----+------+-----------------------+-------+--------------+---+ 
| id | name | address    | phone | order_number |NID| 
+----+------+-----------------------+-------+--------------+---| 
| 1 | Joe | Joes Address   | 1111 | 1390842  | 1 | 
| 2 | Paul | Pauls Address   | 2222 | 9082309  | 2 | 
| 3 | Greg | Gregs Address   | 3333 | 0928340  | 3 | 
| 4 | Lucy | Lucys Address   | 4444 | 9028340  | 4 | 
| 5 | Paul | Pauls Address   | 2222 | 8958399  | 2 | 
| 6 | Tom | Toms Address   | 5555 | 9084024  | 5 | 
| 7 | Lucy | Lucys Another Address | 4444 | 9801983  | 4 | 
| 8 | Paul | Pauls Another Address | 2222 | 0982304  | 2 | 
+----+------+-----------------------+-------+--------------+---+ 

我該怎麼做?

+0

你只是想顯示NID作爲查詢結果或想要添加表中的列嗎? –

回答

1

有些什麼類似通過使用用戶定義的變量

select `id`, `name`, `address`, `phone`, `order_number`, 
@b:= case when `name` <> @a then @b + 1 else @b end NID, 
@a:= `name` 
from (
    select * 
    from demo b, 
    (select @a:=null,@b:=1) a 
    order by name 
) c 

DEMO

另一種簡單的版本,通過假設id列設置你想要的結果設置爲自動遞增,如果這樣,那麼你可以使用相關子查詢挑最小的ID爲同名記錄

select a.*, 
(select min(id) from demo b where a.name = b.name) nid 
from demo a 

注一波夫將不能保證它會完全依賴於id列值

DEMO

0

如果你只是想顯示的NID序列,然後@M哈立德朱奈德的回答將正常工作。

但是如果你想添加的列NID在表中,那麼下面的查詢將完成這項工作:

alter table t 
add column nid integer; 

update t 
set nid = (Select 
      (case when count(name)>1 then min(id) 
       else id 
      end) 
      from 
      (select *from t) x 
      where t.name = x.name   
      ); 

注:Nid不含有增量序列。它基於id列。

希望它有幫助!

+0

它按預期工作嗎? –