Вобщем, задача такая - вывести рейтинг песен, за которые голосовали пользователи.
1. Есть таблица с песнями
2. Есть таблица с голосами, в которой след поля: голос (от -2 до +2 за песню), id пользователя, id песни, дата голосования.
Задача - отсортировать песни по сумме голосов в таблице номер 2. Сам понимаю, что ничего сложного, но вся загвоздка в том, что один пользователь может проголосовать несколько раз за одну и туже песню. А вывести нужно голоса за неделю...
Заранее спасибо.
1. GolDenOne - 30 Ноября, 2006 - 16:19:49 - перейти к сообщению
2. GolDenOne - 02 Декабря, 2006 - 11:08:02 - перейти к сообщению
Вот наваял такой запрос:
$query = "SELECT * FROM songs LEFT JOIN golos ON (golos.song_id = songs.id) WHERE status=1 ORDER BY SUM(golos.golos)";
Выдает ошибку...
$query = "SELECT * FROM songs LEFT JOIN golos ON (golos.song_id = songs.id) WHERE status=1 ORDER BY SUM(golos.golos)";
Выдает ошибку...
3. evgenijj - 02 Декабря, 2006 - 21:12:23 - перейти к сообщению
GolDenOne пишет:
...один пользователь может проголосовать несколько раз за одну и туже песню.
Я так понимаю, что тебе надо правильно учесть голоса тех недобросовестных пользователей, которые проголосовали за одну песню несколько раз. А не проще было проверять, не голосовал ли этот пользователь за эту песню, и если голосовал - не добавлять эту запись в БД?
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- Таблица songs
- id_song | title
- 1 | Мать пишет
- 2 | Разговор в поезде
- 3 | Так вот какая ты
- 4 | Синяя птица
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- Таблица voting
- id_song | id_user | voting | puttime
- 1 | 1 | 1 | 2006-12-01 11:34:15
- 1 | 2 | 1 | 2006-12-01 16:55:11
- 2 | 3 | 1 | 2006-11-29 22:17:53
- 2 | 4 | 0 | 2006-11-29 12:22:11
- 3 | 5 | -1 | 2006-11-29 11:52:27
- 4 | 6 | 2 | 2006-12-02 17:18:22
- 2 | 3 | 2 | 2006-11-22 16:54:12
- 4 | 8 | 1 | 2006-11-20 17:55:11
- 1 | 2 | 2 | 2006-12-02 17:17:11
- 1 | 2 | 2 | 2006-12-02 17:17:38
Запрос:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- SELECT temp.id_song, songs.title, AVG( temp.vote ) AS voting
- FROM (
- SELECT id_song, id_user, AVG( voting ) AS vote
- FROM voting
- WHERE puttime >= SUBDATE( NOW(), INTERVAL 7 DAY )
- GROUP BY id_song, id_user
- ) AS temp, songs
- WHERE songs.id_song = temp.id_song
- GROUP BY temp.id_song
- ORDER BY voting DESC;