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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите составить запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: SELECT...
GolDenOne
Отправлено: 30 Ноября, 2006 - 16:19:49
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Нояб. 2006  


Помог: 0 раз(а)




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

Задача - отсортировать песни по сумме голосов в таблице номер 2. Сам понимаю, что ничего сложного, но вся загвоздка в том, что один пользователь может проголосовать несколько раз за одну и туже песню. А вывести нужно голоса за неделю...
Заранее спасибо.


-----
Мужской деловой журнал - http://www.bvr.com.ua
 
 Top
GolDenOne
Отправлено: 02 Декабря, 2006 - 11:08:02
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Нояб. 2006  


Помог: 0 раз(а)




Вот наваял такой запрос:
$query = "SELECT * FROM songs LEFT JOIN golos ON (golos.song_id = songs.id) WHERE status=1 ORDER BY SUM(golos.golos)";

Выдает ошибку...


-----
Мужской деловой журнал - http://www.bvr.com.ua
 
 Top
evgenijj
Отправлено: 02 Декабря, 2006 - 21:12:23
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




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.  
 
 Top
GolDenOne
Отправлено: 04 Декабря, 2006 - 10:17:53
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Нояб. 2006  


Помог: 0 раз(а)




Ну не совсем так... Замысел в том, чтобы пользователь мог таки голосовать за одну и туже песню несколько раз. Проверка стоит, голосовать пользователь может раз в сутки.

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

$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(Добавление)
Спасибо за помошь...


-----
Мужской деловой журнал - http://www.bvr.com.ua
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB