Принудительная запись на вершину при выполнении GROUP BY

0

У меня есть следующий MySQL-запрос и таблицы, из которых я запрашиваю:

SELECT
 `Song`.`id`,
 `Song`.`file_name`,
 `User`.`first_name`,
 `Vote`.`value`,
 Sum(`Vote`.`value`) AS score
FROM `songs` AS `Song`
LEFT JOIN votes AS `Vote` ON (`Song`.`id`=`Vote`.`song_id`)
LEFT JOIN `users` AS `User` ON (`Song`.`user_id` = `User`.`id`)
GROUP BY `Vote`.`song_id`
LIMIT 20;

mysql> describe songs;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment | 
| file_name | varchar(255) | NO   |     | NULL    |                | 
| user_id   | int(11)      | NO   |     | NULL    |                | 
| created   | datetime     | NO   |     | NULL    |                | 
| modified  | datetime     | NO   |     | NULL    |                | 
+-----------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> describe users;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment | 
| username   | varchar(255) | NO   |     | NULL    |                | 
| password   | varchar(255) | NO   |     | NULL    |                | 
| first_name | varchar(255) | NO   |     | NULL    |                | 
| last_name  | varchar(255) | NO   |     | NULL    |                | 
| is_admin   | tinyint(1)   | NO   |     | 0       |                | 
| created    | datetime     | NO   |     | NULL    |                | 
| modified   | datetime     | NO   |     | NULL    |                | 
+------------+--------------+------+-----+---------+----------------+

mysql> describe votes;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment | 
| value    | int(11)  | NO   |     | NULL    |                | 
| song_id  | int(11)  | NO   |     | NULL    |                | 
| user_id  | int(11)  | NO   |     | NULL    |                | 
| created  | datetime | NO   |     | NULL    |                | 
| modified | datetime | NO   |     | NULL    |                | 
+----------+----------+------+-----+---------+----------------+

Этот запрос работает так же, как я хочу, за исключением одной вещи. Значение, возвращаемое в поле Vote.value, не из строки, связанной с пользователем, который зарегистрирован в приложении. Мне нужно, чтобы оценка была суммой всех значений независимо от того, с каким пользователем она связана, но поле Vote.value должно принадлежать зарегистрированному пользователю (каждый пользователь получает только один голос за песню).

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

Теги:
sorting
group-by
sql-order-by

1 ответ

1
Лучший ответ

и третье соединение

LEFT JOIN votes AS `VotePerUser` ON (`Song`.`id`=`Vote`.`song_id` 
AND `Song`.`user_id`=`votes`.`user_id`)

и замените Vote.value на VotePerUser.Value

  • 0
    Я решил это с помощью подзапроса, а затем вернулся, чтобы проверить и увидеть ваше решение. Мне нравится твой намного лучше! Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню