2013-07-07 80 views
1

這有點難以解釋,所以我會一步一步來做。下面是我創建的表格。Mysql排名排行

id | item_1 | item_2 | item_3| 
32 | 1 | 43 | 54 | 
32 | 54 | 32 | 32 | 
67 | 42 | 45 | 12 | 

正如你所看到的,前兩排具有相同的ID,我的目標是,讓第一行是(1 + 43 + 54)的總和,而第二行的總和是(54 + 32 + 32),然後添加具有相同ID的兩行並從高到低排序。我設法用下面的代碼來做到這一點。但是如果我想獲得該行的position,如下表所示。我基本上正在做一些排名系統,我首先通過item_sum命令他們,然後獲取行的位置。我怎樣才能實現它?

position | id | item_sum | 
    1 | 32 | 218 | 
    2 | 67 | 99 | 

select 
     id, 
     sum(item_1+item_2+item_3) as item_sum 
from yourtable 
group by id 
order by item_sum desc; 

我試着做下面這段代碼:但位置號碼不按順序排列,因爲我通過「item_sum」

SET @position=0; 
SELECT @position:= @position+1 AS position, 
      id, 
      sum(item_1+item_2+item_3) as item_sum 
    from yourtable 
    group by id 
    order by item_sum desc; 
+0

所以你期望返回的結果是:'32 - 216,67 - 99'? – BenM

+1

id 32的總數是216.它是218嗎? –

+0

稱爲'id'('identifier'的縮寫)的列應該是一個獨特的屬性。所以不應該有多個具有相同ID的行。如果有,那麼這個列不是一個id。 –

回答

0

假設我理解正確你的問題設置的順序,這應該工作精細:

SELECT `yourtable`.`id` AS `id`, 
     `count`.`total` AS `item_count` 
FROM `yourtable` 
LEFT JOIN (
    SELECT `id`, SUM(`item_1` + `item_2` + `item_3`) AS `total` 
     FROM `yourtable` GROUP BY `id` 
) `count` ON `count`.`id` = `yourtable`.`id` 
GROUP BY `yourtable`.`id` 
ORDER BY `count`.`total` DESC 

以上將返回:

+--------+------------+ 
| id | item_count | 
+--------+------------+ 
| 32 | 216  | 
| 67 |  99  | 
+--------+------------+ 

請參閱SQLFiddle demo以進行全面的工作演示。

+0

我想要一個排名系統,如1行=位置1,行2 =位置2,行3 =位置3,依此類推...... – user2310422

+0

這就是它給你的......你只需要添加你自己的計數? – BenM

+0

是的,我需要添加自己的計數,您沒有在代碼中指定 – user2310422

2

你已經提出這個問題了。我以前給過答。其實不知道你的要求是什麼......

SELECT @rn:[email protected]+1 AS position, item_sum , id 
FROM (
    select 
     id, 
     sum(item_1+item_2+item_3) as item_sum 
from yourtable 
group by id 
order by item_sum desc 
) t1, (SELECT @rn:=0) t2; 

一看便知。 Here look for what you need