2013-10-21 19 views
0

我有一個包含以下數據的表。在MYSQL中只分組和更新一些特定的值

表名:t_keyword_count

f_id  f_keyword  f_count  f_dominant 
================================================== 
101  C++    2    0 
101  Java    4    0 
101  PHP    6    0 
101  Python   5    0 
101  Ruby    9    0 
102  ruby    4    0 
102  java    6    0 
102  php    9    0 
102  C++    7    0 
102  Jquery   2    0 

就像那個


我需求量的是:我需要更新爲1,我想對於F_ID前3 f_count值f_dominant狀態。即我想這個結果集

101 ruby  9 1 
101 php  6 1 
101 python 5 1 
101 JAVA  4 0 
101 c++  2 0 
102 php  9 1 
102 c++  7 1 
102 jAVA  6 1 
102 RUBY  4 0 
102 JQUERY 2 0 
+0

想必PK是(F_ID,f_keyword) – Strawberry

+0

@Edper看只有第一3已經f_dominant = 1 – Manu

回答

1
SELECT x.* 
    , CASE WHEN COUNT(*) <= 3 THEN 1 ELSE 0 END f_dominant 
    FROM t_keyword_count x 
    JOIN t_keyword_count y 
    ON y.f_id = x.f_id 
    AND y.f_count >= x.f_count 
GROUP 
    BY x.f_id,x.f_keyword 
ORDER 
    BY f_id,f_count DESC; 

或類似的東西

+0

「分組和更新」是指他想的更新請求不是一個選擇一個,做他呢? – Manu

+1

他認爲他有,但他錯了。通常情況下,您不會存儲可以非常方便地「即時」計算的數據。 – Strawberry

0

這工作,但它很可能將是緩慢的行數過多:

update t_keyword_count t 
    set f_dominant = 
    f_count >= (select f_count from 
        (select * from t_keyword_count) a 
        where f_id = t.f_id 
       order by f_count desc 
       limit 2,1 
       ) 

http://sqlfiddle.com/#!2/47504/2

或者這如果更新完成一次:

update t_keyword_count t 
    set f_dominant = 1 
    where f_count >= (select f_count from 
        (select * from t_keyword_count) a 
        where f_id = t.f_id 
       order by f_count desc 
       limit 2,1 
       ) 

http://sqlfiddle.com/#!2/de3ec/1

+0

但它一次更新500個ID。我的數據庫中有60,000個ID。我如何一次更新這些內容。我有6張這樣的桌子。請幫幫我 – user2889331