Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблица с продуктами с рейтингом. Возможно ли каким-то mysql запросом проставить продуктам место в рейтинге(у 1-го продукта должно получиться второе место, у 2-го - первое, у третьего - третье и т.д. в зависимости от значения good_rating)?
Неактивен
Во, это по-нашему, прилагать к вопросу сразу дамп таблички! Все бы так делали еще ...
drop table if exists t_5079_goods;
CREATE TABLE IF NOT EXISTS `t_5079_goods` ( `good_id` int(11) NOT NULL AUTO_INCREMENT, `good_rating` int(11) NOT NULL, `good_rating_place` int(11) NOT NULL, PRIMARY KEY (`good_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `t_5079_goods` (`good_id`, `good_rating`, `good_rating_place`) VALUES (1, 30, 0), (2, 57, 0), (3, 25, 0), (4, 11, 0);
mysql> select * from t_5079_goods; +---------+-------------+-------------------+ | good_id | good_rating | good_rating_place | +---------+-------------+-------------------+ | 1 | 30 | 0 | | 2 | 57 | 0 | | 3 | 25 | 0 | | 4 | 11 | 0 | +---------+-------------+-------------------+ 4 rows in set (0.00 sec)
Далее создаём копию таблицы, иначе не получится обновить в один запрос.
create table t_5079_goods_ like t_5079_goods;
insert into t_5079_goods_ select * from t_5079_goods;
Теперь непосредственно вычисляем место (исходя из того, сколько записей имеют больший/меньший рейтинг, чем текущая).
update t_5079_goods g set good_rating_place=(select count(*)+1 from t_5079_goods_ where good_id<>g.good_id and good_rating > g.good_rating);
mysql> select * from t_5079_goods; +---------+-------------+-------------------+ | good_id | good_rating | good_rating_place | +---------+-------------+-------------------+ | 1 | 30 | 2 | | 2 | 57 | 1 | | 3 | 25 | 3 | | 4 | 11 | 4 | +---------+-------------+-------------------+ 4 rows in set (0.00 sec)
И удаляем временную таблицу drop table t_5079_goods_;
Профит!
Отредактированно deadka (12.12.2011 23:47:09)
Неактивен
Круто. Спасибо! То, что надо.
Так и знал, что все просто, но допереть что-то не мог
Неактивен