2014-09-29 45 views
2

我想更新一個表,但需要按店名分組。我希望具有相同商店名稱的所有分組條目都使用相同的ID進行更新。所有其他商店都應該有自己的ID。MySQL更新與分組和變量

所以,這就是我想:

SET @row_number:=0; 

UPDATE `TABLE 75` as t1 
INNER JOIN (SELECT search_shop FROM `TABLE 75` WHERE sap_id = '' GROUP BY search_shop) as t2 
ON t1.search_shop = t2.search_shop 
SET sap_id = CONCAT('XX',@row_number:[email protected]_number+1) 

與此查詢每一個項目獲取是一個自己的ID - 即使是同名的人。

所以我想是這樣的:

shop_name - sap_id 
sm_name_1 - XX1 
sm_name_2 - XX2 
sm_name_2 - XX2 
sm_name_3 - XX3 

等。

感謝您的幫助! :)

+0

剛一說明,而不是加入表本身,你可以簡單地寫'那裏sap_id = '''。或者查詢比您在這裏顯示的更復雜?如果您必須更新單個表或您必須加入它,則可能很重要。 – fancyPants 2014-09-29 15:07:19

+0

我需要加入它,因爲我無法通過group更新一行,可以嗎?連接的主要目的應該是獲得與組相同的命名條目,並使用相同的sap_id更新它們。但是 - 正如我在我的問題中提到的那樣 - 使用該查詢,無論是否存在其他相同的命名條目,每行都會獲得自己的ID。 – sleepless 2014-09-30 06:30:04

+0

好吧,提供樣本數據和預期結果可能是一個好主意。你的加入和團隊真的沒有意義,沒有冒犯性,或者我根本不理解你想做什麼。 – fancyPants 2014-09-30 07:14:01

回答

1
CREATE TABLE t 
    (`shop_name` varchar(9), `sap_id` varchar(3)) 
; 

INSERT INTO t 
    (`shop_name`, `sap_id`) 
VALUES 
    ('sm_name_1', ''), 
    ('sm_name_2', 'XX2'), 
    ('sm_name_2', ''), 
    ('sm_name_3', 'XX3'), 
    ('sm_name_3', ''), 
    ('sm_name_4', ''), 
    ('sm_name_5', '') 
; 

update t 
inner join (
    select 
    t.shop_name 
    , CONCAT('XX', @rn := if(@prev = shop_name, @rn, @rn + 1)) as sap_id 
    , @prev := shop_name 
    from 
    t 
    , (select @prev := null, @rn := 0) var_init 
    order by shop_name 
)sq on t.shop_name = sq.shop_name 
set t.sap_id = sq.sap_id; 

select * from t; 

| SHOP_NAME | SAP_ID | 
|-----------|--------| 
| sm_name_1 | XX1 | 
| sm_name_2 | XX2 | 
| sm_name_2 | XX2 | 
| sm_name_3 | XX3 | 
| sm_name_3 | XX3 | 
| sm_name_4 | XX4 | 
| sm_name_5 | XX5 | 
+0

看起來非常好,很好的想法與順序:)非常感謝你! – sleepless 2014-09-30 08:15:45