2014-09-29 71 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