Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Как определить на MySQL позицию (место) в зависимости от рейтинга пользователей или товаров

Практика




Как определить позицию (место) в зависимости от рейтинга пользователей или товаров?

есть таблица

CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(255) NOT NULL,
positions int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (id),

)
ENGINE = INNODB
AVG_ROW_LENGTH = 630
CHARACTER SET utf8
COLLATE utf8_unicode_ci;

если одним запросом и учитывать то что у людей или товаров могут быть одинаковые рейтинги то можно например так, но хранить рейтингуи нужно будет в отдельной таблице



SET @position = 0;
DELETE
FROM raiting_place_user;
INSERT INTO raiting_place_user (id, raiting_place, rating)
SELECT
id,
@position := @position + 1 AS pos,
rating
FROM (SELECT
*
FROM user
WHERE utype = 0
ORDER BY rating DESC) user
WHERE utype = 0;






CREATE TABLE raiting_place_user (
id int(11) NOT NULL,
raiting_place int(11) NOT NULL DEFAULT 0,
rating int(11) DEFAULT NULL COMMENT 'просто для проверки (можно удалить)',
PRIMARY KEY (id),
CONSTRAINT FK_raiting_place_user_user_id FOREIGN KEY (id)
REFERENCES user (id) ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = INNODB
AVG_ROW_LENGTH = 512
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'место рейтингов пользователей';



сами запросы лучше упокавать в процедуру, которую вызывать триггером

CREATE DEFINER = 'root'@'127.0.0.1'
PROCEDURE update_positions()
BEGIN
SET @position = 0;
DELETE
FROM raiting_place_user;
INSERT INTO raiting_place_user (id, raiting_place, rating)
SELECT
id,
@position := @position + 1 AS pos,
rating
FROM (SELECT
*
FROM user
WHERE utype = 0
ORDER BY rating DESC) user
WHERE utype = 0;



END



триггер при удалении пользователя
CREATE
DEFINER = 'root'@'127.0.0.1'
TRIGGER deleteuser
AFTER DELETE
ON user
FOR EACH ROW
BEGIN
CALL update_positions();
END


при вставке не получится сделать триггер, вызывайте сами CALL update_positions();

и при обновлении


CREATE
DEFINER = 'root'@'127.0.0.1'
TRIGGER addeditstatus
AFTER UPDATE
ON user
FOR EACH ROW
BEGIN



IF (@DISABLE_TRIGGERS IS NULL) AND (OLD.rating <> NEW.rating) THEN
# изменение рейтинга и пересчет позиций

CALL update_positions();

END IF;


END

а можно переписать результаты одним запросы в основную таблицу (будет использоваться при сортировке)


??
да , можно

CREATE DEFINER = 'root'@'127.0.0.1'
PROCEDURE copy_positions()
BEGIN
UPDATE user, raiting_place_user
SET user.positions = IF( ISNULL(raiting_place_user.raiting_place),0, raiting_place_user.raiting_place)
WHERE user.id = raiting_place_user.id;

END


вызывайте так

CALL copy_positions();
создано: 2013-08-06
обновлено: 2021-03-13
484



Рейтиг 10 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Базы данных - MySql (Maria DB)

Термины: Базы данных - MySql (Maria DB)