Pull to refresh

Comments 4

mysql> describe rt;
+--------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| rating | int(11) | YES | | NULL | |
| place | int(11) | YES | | NULL | |
+--------+---------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql> select * from rt;
+------+--------+-------+
| id | rating | place |
+------+--------+-------+
| 1 | 86 | NULL |
| 2 | 5 | NULL |
| 3 | 5 | NULL |
+------+--------+-------+
3 rows in set (0.00 sec)

mysql> update rt set place = (select @rownum:=@rownum+1 from (select @rownum:=0)
t) order by rating, id;

Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0

mysql> select * from rt;
+------+--------+-------+
| id | rating | place |
+------+--------+-------+
| 1 | 86 | 3 |
| 2 | 5 | 1 |
| 3 | 5 | 2 |
+------+--------+-------+
3 rows in set (0.00 sec)
Упц. Не знал про возможность использования :=
Сам сделал через update...select
то есть update на т.н. inline view?

на мой вариант ушло 5 минут, первый поиск по запросу «mysql rownum» вернул конструкцию как я привел.

для меня было откровением update… order by rating, id :) это необычно.
У меня такой запрос получился:
UPDATE persons AS c, (
SELECT f1.id AS id, COUNT(f2.id) as rnk
FROM persons as f1
LEFT JOIN persons as f2 on
(f2.rating>f1.rating) OR ((f2.rating=f1.rating) AND (f2.id<=f1.id))
GROUP BY f1.id
) as r
SET c.rank=r.rnk
WHERE c.id=r.id

Заменил на ваш :)
Sign up to leave a comment.

Articles