SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.12.2011 23:19:00

BOB41K
Участник
Зарегистрирован: 14.11.2008
Сообщений: 8

Проставить продуктам место в рейтинге

Есть таблица с продуктами с рейтингом. Возможно ли каким-то mysql запросом проставить продуктам место в рейтинге(у 1-го продукта должно получиться второе место, у 2-го - первое, у третьего - третье и т.д. в зависимости от значения good_rating)?

CREATE TABLE IF NOT EXISTS `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 `goods` (`good_id`, `good_rating`, `good_rating_place`) VALUES
(1, 30, 0),
(2, 57, 0),
(3, 25, 0),
(4, 11, 0);

Неактивен

 

#2 12.12.2011 23:46:33

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Проставить продуктам место в рейтинге

Во, это по-нашему, прилагать к вопросу сразу дамп таблички! Все бы так делали еще smile...


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)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 13.12.2011 00:15:26

BOB41K
Участник
Зарегистрирован: 14.11.2008
Сообщений: 8

Re: Проставить продуктам место в рейтинге

Круто. Спасибо! То, что надо.
Так и знал, что все просто, но допереть что-то не могsmile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson