2014-12-04 122 views
0

我有以下的架構(MySQL的)如何爲特定項目

create table test(
    userid int(11) not null, 
    item varchar(15), 
    bookid int(11)); 

insert into test values ('1','journal',NULL); 
insert into test values ('1','journal',NULL); 
insert into test values ('1','book',NULL); 
insert into test values ('2','book',NULL); 
insert into test values ('2','journal',NULL); 
insert into test values ('1','book',NULL); 
insert into test values ('2','journal',NULL); 
insert into test values ('3','book',NULL); 
insert into test values ('1','book',NULL); 
insert into test values ('1','journal',NULL); 
insert into test values ('3','journal',NULL); 
insert into test values ('1','journal',NULL); 
insert into test values ('2','journal',NULL); 
insert into test values ('2','book',NULL); 
insert into test values ('2','journal',NULL); 
insert into test values ('1','journal',NULL); 
insert into test values ('3','book',NULL); 
insert into test values ('3','book',NULL); 
insert into test values ('3','book',NULL); 
insert into test values ('3','book',NULL); 

創建一個計數列,只要有一本書,我想在指定的BOOKID列從1開始自動遞增。對於每個用戶,編號從1開始。我知道這可以通過創建一個單獨的表來完成。有沒有一種方法可以避免這種情況,並在此表中使用某種更新查詢並更新列bookid?我試圖得到類似以下的輸出:

userid,item,bookid 
'1','journal',NULL 
'1','journal',NULL 
'1','book',1 
'2','book',1 
'2','journal',NULL 
'1','book',2 
'2','journal',NULL 
'3','book',1 
'1','book',3 
'1','journal',NULL 
'3','journal',NULL 
'1','journal',NULL 
'2','journal',NULL 
'2','book',2 
'2','journal',NULL 
'1','journal',NULL 
'3','book',2 
'3','book',3 
'3','book',4 
'3','book',5 

我很感激,如果有人能指導我如何做到這一點?

回答

2

這裏有一個想法...

drop table if exists test; 

    create table test 
    (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
    ,userid int not null 
    ,item varchar(15) NOT NULL 
); 

    insert into test (userid,item) values 
    (1,'journal') 
    ,(1,'journal') 
    ,(1,'book') 
    ,(2,'book') 
    ,(2,'journal') 
    ,(1,'book') 
    ,(2,'journal') 
    ,(3,'book') 
    ,(1,'book') 
    ,(1,'journal') 
    ,(3,'journal') 
    ,(1,'journal') 
    ,(2,'journal') 
    ,(2,'book') 
    ,(2,'journal') 
    ,(1,'journal') 
    ,(3,'book') 
    ,(3,'book') 
    ,(3,'book') 
    ,(3,'book'); 

    SELECT x.* 
     , COUNT(*) rank 
    FROM test x 
    JOIN test y 
     ON y.userid = x.userid 
    AND y.item = x.item 
    AND y.id <= x.id 
    GROUP 
     BY id 
    ORDER 
     BY userid 
     , item 
     , rank; 
    +----+--------+---------+------+ 
    | id | userid | item | rank | 
    +----+--------+---------+------+ 
    | 3 |  1 | book | 1 | 
    | 6 |  1 | book | 2 | 
    | 9 |  1 | book | 3 | 
    | 1 |  1 | journal | 1 | 
    | 2 |  1 | journal | 2 | 
    | 10 |  1 | journal | 3 | 
    | 12 |  1 | journal | 4 | 
    | 16 |  1 | journal | 5 | 
    | 4 |  2 | book | 1 | 
    | 14 |  2 | book | 2 | 
    | 5 |  2 | journal | 1 | 
    | 7 |  2 | journal | 2 | 
    | 13 |  2 | journal | 3 | 
    | 15 |  2 | journal | 4 | 
    | 8 |  3 | book | 1 | 
    | 17 |  3 | book | 2 | 
    | 18 |  3 | book | 3 | 
    | 19 |  3 | book | 4 | 
    | 20 |  3 | book | 5 | 
    | 11 |  3 | journal | 1 | 
    +----+--------+---------+------+ 

注意的MyISAM實際上可以讓你使用複合PK中,該複合材料的一部分,是一個自動遞增的ID,但是InnoDB的prohinits這一點。

在更大的數據集沿着這些路線的查詢將可能是更爲有效的...

SELECT id 
    , userid 
    , item 
    , IF(@userid=userid,IF(@item=item,@i:[email protected]+1,@i:=1),@i:=1) rank 
    , @userid := userid 
    , @item := item 
    FROM test 
    , (SELECT @userid = NULL,@item:='',@i:=1) vars 
ORDER 
    BY userid,item,id; 
+0

這是個好主意,做這15萬條記錄,多列?我可能有鎖表問題。我一直在尋找可能在同一張桌子上更新的解決方案(如果這樣更便宜的話) – rk567 2014-12-04 18:42:26

+0

沒有。有更好的解決方案... – Strawberry 2014-12-04 20:50:57

+0

...請參閱上面的編輯。 – Strawberry 2014-12-04 22:30:30

相關問題