【问题标题】:mysql sorting and ranking statementmysql排序和排名语句
【发布时间】:2011-08-14 12:52:18
【问题描述】:

我需要一些关于 mysql 语句的帮助 Ive table1 有 7 列和 table 2 有 8 列名为排名的额外列,我的陈述应该是 从表 1 中选择所有然后按“用户数”对其进行排序将其插入表 2 并排名开始 1 2 3 等,

table 1 : 
username |     email         | number of users
jack          a@a.com               75
ralf          b@b.com               200
anne          c@c.com                12
sonny         d@d.com                300

====================================

这里我需要根据用户数量插入和排名

table 2 

ranking    | username |     email         | number of users
1
2
3

【问题讨论】:

  • 您能否发布一个表格示例和预期结果?
  • 两个表是如何关联的?一些公共列甚至外键应该是

标签: mysql


【解决方案1】:

我会避免使用另一张桌子。一个查询就足够了。

create table mytable (
id int not null auto_increment primary key,
username varchar(50),
email varchar(50),
number int
) engine = myisam;

insert into mytable (username,email,number)
values 
('a','aaa',10),
('b','bbb',30),
('c','ccc',50),
('d','ddd',30),
('e','eee',20),
('f','fff',45),
('g','ggg',20);

select @r:=@r+1 as rnk,username,email,number
from mytable,(select @r:=0) as r order by number desc

+------+----------+-------+--------+
| rnk  | username | email | number |
+------+----------+-------+--------+
|    1 | c        | ccc   |     50 |
|    2 | f        | fff   |     45 |
|    3 | b        | bbb   |     30 |
|    4 | d        | ddd   |     30 |
|    5 | e        | eee   |     20 |
|    6 | g        | ggg   |     20 |
|    7 | a        | aaa   |     10 |
+------+----------+-------+--------+
7 rows in set (0.00 sec)

这是一个考虑关系的更智能的版本

select @r:=@r + 1 as rn, username,email,
@pos:= if(@previous<>number,@r,@pos) as position,
@previous:=number as num
from mytable,(select @r:=0,@pos:=0,@previuos:=0) as t order by number desc 

+------+----------+-------+----------+--------+
| rn   | username | email | position | num    |
+------+----------+-------+----------+--------+
|    1 | c        | ccc   |        1 |     50 |
|    2 | f        | fff   |        2 |     45 |
|    3 | b        | bbb   |        3 |     30 |
|    4 | d        | ddd   |        3 |     30 |
|    5 | e        | eee   |        5 |     20 |
|    6 | g        | ggg   |        5 |     20 |
|    7 | a        | aaa   |        7 |     10 |
+------+----------+-------+----------+--------+
7 rows in set (0.00 sec)

【讨论】:

    【解决方案2】:
    INSERT INTO table2
      SELECT @rank := @rank + 1, table1.* FROM table1
      JOIN( SELECT @rank := 0 ) AS init
      ORDER BY number_of_users DESC
    

    【讨论】:

    • 还有一件事,当我第一次做这个排名,并尝试再次重新排名时,它说重复的键@排名:1 我们如何在不时重新排名时避免这种情况
    • @user 您不能这样做两次,因为显然您的排名列是唯一的,这是一件好事,您不想在该列中重复排名,在运行此查询之前 table2 必须为空。您可以使用以下查询清空 table2:TRUNCATE table2。
    • 所以每次我需要重新排列用户 ive 以清空表格! mm不能更新吗?
    • @user 使用您当前的表结构,我会说是的。您也许可以编写一个复杂的 UPDATE 查询,它可以增量执行此操作,但我怀疑这比截断表并重新填充它要昂贵得多。
    【解决方案3】:

    你需要做这样的事情:

    SELECT * FROM `table1`
    INNER JOIN `table2` USING ([a common filed name here])
    ORDER BY table2.[the filed name here]
    

    祝你好运!

    【讨论】:

    • 表 2 中的 INSERT 在哪里?问题非常模糊,所以我建议等待更明确的要求
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2020-11-30
    • 2011-07-18
    相关资源
    最近更新 更多