因此,我的问题是我有一个客户列表(表现在有大约10万条记录),每个客户的收入。当我按国家分组时,我会获得大约60个国家的收入总和。比我需要按收入DESC进行排序,我的查询看起来像这样:

SELECT s2.i,s1.year,s1.short_c,s1.country,s1.uges FROM
(SELECT u.year,k.short_c,s.country, IFNULL(ROUND(SUM(u.income)),0) as uges
    FROM im_income u,im_contact k,td_countries s
    WHERE u.year=2012
    AND u.customer_id=k.id
    AND k.kat='K'
    AND k.short_c=s.short_c
    GROUP BY k.short_c, u.year
    ORDER BY u.year ASC,uges DESC) s1
CROSS JOIN
(SELECT @i:=@i+1 as i FROM (SELECT @i:= 0) AS i) s2


而且我知道使用CROSS JOIN这样做是错误的,因为它没有满足我的需求,但是有一种方法可以在ORDER BY之后制作一个唯一的ID,因为我需要订购收入为DESC的国家/地区,而不是赋予它们代表该ID的国家排名数字???

结果现在看起来像这样:

+-+----+-------+---------+------+
|i|year|short_c|country  |uges  |
+-+----+-------+---------+------+
|1|2012|USA    |United S.|123456|
+-+----+-------+---------+------+
|1|2012|RU     |Russia   |23456 |
+-+----+-------+---------+------+


我希望以这种方式,但是要通过唯一的i值在订单后分配:

+-+----+-------+---------+------+
|i|year|short_c|country  |uges  |
+-+----+-------+---------+------+
|1|2012|USA    |United S.|123456|
+-+----+-------+---------+------+
|2|2012|RU     |Russia   |23456 |
+-+----+-------+---------+------+
|3|    |       |         |      |
+-+----+-------+---------+------+


任何帮助,将不胜感激。

最佳答案

我认为这是您要寻找的:

SELECT @i := @i + 1 as i, s1.year, s1.short_c, s1.country, s1.uges
FROM (SELECT u.year,
             k.short_c,
             s.country,
             IFNULL(ROUND(SUM(u.income)),0) as uges
      FROM im_income u join
           im_contact k
           on u.customer_id = k.id join
           td_countries s
           on k.short_c = s.short_c
      WHERE u.year = 2012 AND k.kat = 'K'
      GROUP BY k.short_c, u.year
     ) s1
     CROSS JOIN
     (SELECT @i:= 0) const
ORDER BY year, uges desc;


排序后,在“输出”结果时进行变量评估。

我还修复了您的join语法。您应该学会在join子句中使用显式的where而不是隐式的联接。

关于mysql - 由mysql订购后制作唯一的列值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21141343/

10-11 05:24