Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите составить запрос
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Помогите составить запрос

Страниц (1): [1]
 

1. GolDenOne - 30 Ноября, 2006 - 16:19:49 - перейти к сообщению
Вобщем, задача такая - вывести рейтинг песен, за которые голосовали пользователи.
1. Есть таблица с песнями
2. Есть таблица с голосами, в которой след поля: голос (от -2 до +2 за песню), id пользователя, id песни, дата голосования.

Задача - отсортировать песни по сумме голосов в таблице номер 2. Сам понимаю, что ничего сложного, но вся загвоздка в том, что один пользователь может проголосовать несколько раз за одну и туже песню. А вывести нужно голоса за неделю...
Заранее спасибо.
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)";

Выдает ошибку...
3. evgenijj - 02 Декабря, 2006 - 21:12:23 - перейти к сообщению
GolDenOne пишет:
...один пользователь может проголосовать несколько раз за одну и туже песню.

Я так понимаю, что тебе надо правильно учесть голоса тех недобросовестных пользователей, которые проголосовали за одну песню несколько раз. А не проще было проверять, не голосовал ли этот пользователь за эту песню, и если голосовал - не добавлять эту запись в БД?
PHP:
скопировать код в буфер обмена
  1.  
  2. Таблица songs
  3. id_song | title
  4.  1      | Мать пишет
  5.  2      | Разговор в поезде
  6.  3      | Так вот какая ты
  7.  4      | Синяя птица
  8.  

PHP:
скопировать код в буфер обмена
  1.  
  2. Таблица voting
  3. id_song  | id_user | voting | puttime
  4.  1       | 1       | 1      | 2006-12-01 11:34:15
  5.  1       | 2       | 1      | 2006-12-01 16:55:11
  6.  2       | 3       | 1      | 2006-11-29 22:17:53
  7.  2       | 4       | 0      | 2006-11-29 12:22:11
  8.  3       | 5       | -1     | 2006-11-29 11:52:27
  9.  4       | 6       | 2      | 2006-12-02 17:18:22
  10.  2       | 3       | 2      | 2006-11-22 16:54:12
  11.  4       | 8       | 1      | 2006-11-20 17:55:11
  12.  1       | 2       | 2      | 2006-12-02 17:17:11
  13.  1       | 2       | 2      | 2006-12-02 17:17:38
  14.  

Запрос:
PHP:
скопировать код в буфер обмена
  1.  
  2. SELECT temp.id_song, songs.title, AVG( temp.vote ) AS voting
  3. FROM (
  4.         SELECT id_song, id_user, AVG( voting ) AS vote
  5.         FROM voting
  6.         WHERE puttime >= SUBDATE( NOW(), INTERVAL 7 DAY )
  7.         GROUP BY id_song, id_user
  8.         ) AS temp, songs
  9. WHERE songs.id_song = temp.id_song
  10. GROUP BY temp.id_song
  11. ORDER BY voting DESC;
  12.  

Результат
PHP:
скопировать код в буфер обмена
  1.  
  2. id_song | title             | voting
  3.  4      | Синяя птица       | 2.00000000
  4.  1      | Мать пишет        | 1.33335000
  5.  2      | Разговор в поезде | 0.50000000
  6.  3      | Так вот какая ты  | -1.00000000
  7.  

Подзапрос
PHP:
скопировать код в буфер обмена
  1.  
  2. SELECT id_song, id_user, AVG( voting ) AS vote
  3. FROM voting
  4. WHERE puttime >= SUBDATE( NOW(), INTERVAL 7 DAY )
  5. GROUP BY id_song, id_user;
  6.  

позволяет правильно учесть голоса тех пользователей, которые проголосовали за одну песню несколько раз. Пользователь id_user=2 проголосовал за песню id_song=1 три раза. Результат этого подзапроса
PHP:
скопировать код в буфер обмена
  1.  
  2. id_song | id_user | vote
  3.  1      | 1       | 1.0000
  4.  1      | 2       | 1.6667
  5.  2      | 3       | 1.0000
  6.  2      | 4       | 0.0000
  7.  3      | 5       | -1.0000
  8.  4      | 6       | 2.0000
  9.  
4. GolDenOne - 04 Декабря, 2006 - 10:17:53 - перейти к сообщению
Ну не совсем так... Замысел в том, чтобы пользователь мог таки голосовать за одну и туже песню несколько раз. Проверка стоит, голосовать пользователь может раз в сутки.

Вот что у меня получилось:

$query="SELECT songs.song, songs.id, songs.ispolnitel, SUM(golos.golos) AS golosa
FROM songs LEFT OUTER JOIN golos ON golos.song_id = songs.id
GROUP BY songs.song
ORDER BY golosa DESC";\n\n(Добавление)
Спасибо за помошь...

 

Powered by ExBB FM 1.0 RC1