Mysql排名行

时间:2013-07-07 07:31:51

标签: php mysql sql

这有点难以解释,所以我会一步一步地这样做。下面是我创建的表格。

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;

2 个答案:

答案 0 :(得分:2)

你已经问过这个问题了。我之前已经给出了答案。实际上不知道你的要求是什么......

SELECT @rn:=@rn+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

答案 1 :(得分: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了解完整的工作示范。