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 :: Помоч составить sql запрос.

 PHP.SU

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


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

> Без описания
Flash_PR
Отправлено: 20 Августа, 2015 - 22:57:17
Post Id



Посетитель


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


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




Не часто я обращаюсь за помощью, стараюсь все таки гуглить. Но сейчас какой то ступор.
Задача составить sql запрос (возможно ли одним?). Схему таблиц рисовать не буду пока, но если в процессе обсуждения потребуется, нарисую. Пока попробую на словах.
Имеем конкретный id пользователя.

Есть таблица с материалами (например новости) пользователей. Т.е. каждый материал принадлежит какому то конкретному пользователю (есть поле с id пользователем, но с таблицей пользователей она не связана, на запрос это не должно влиять вроде). У пользователя может быть много материалов. С таблицей материалов(новостей) связана (один ко многим) таблица голосов. Т.е. один материал(новость) может иметь много голосов. Структура голосов упростим, id кто проголосовал и поле голос единичка (1) Вот их и просуммировать надо.

Задача составить запрос получения суммы ВСЕХ голосов ВСЕХ материалов данного пользователя.....)

ЗЫ: после будет еще один вопрос по структуре таблицы голосов.

(Отредактировано автором: 20 Августа, 2015 - 22:59:23)



-----
Умные мысли приходят тогда, когда все глупости уже сделаны...
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 20 Августа, 2015 - 23:19:26
Post Id



Активный участник


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


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




Не втуплю в одном только (от этого зависит решение) -- это сумма голосов к одному конкретному пользаку (напр. в его профиле) или надо составить типа рейтинг всех пользаков по сумме голосов?
 
 Top
Flash_PR
Отправлено: 20 Августа, 2015 - 23:24:30
Post Id



Посетитель


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


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




DeepVarvar пишет:
Не втуплю в одном только (от этого зависит решение) -- это сумма голосов к одному конкретному пользаку (напр. в его профиле) или надо составить типа рейтинг всех пользаков по сумме голосов?


Первое. В начале я указал один конкретный пользователь. У него много новостей, за эти новости другие пользователи давали голос (1). Надо посчититать сумму голосов всех всех материалов этого конкретного пользователя.

Пользователь Вася (id=30) имеет 2 новости (в таблице новостей для этих новостей указан id=1 принадлежащий пользователю).
Таблица новости

id id_user
1 30
2 30
3 15

Таблица голосов(связана с таблицей новостей)
id id_новости голос
1 1 1
2 1 1
3 1 1
4 2 1
5 1 1
6 1 1
7 2 1
8 2 1
9 2 1
10 3 1
11 3 1

======================
Итого: Вася(30) имеет 9 голосов по своим новостям

(Отредактировано автором: 20 Августа, 2015 - 23:54:04)



-----
Умные мысли приходят тогда, когда все глупости уже сделаны...
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 20 Августа, 2015 - 23:25:48
Post Id



Активный участник


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


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




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.         SUM(v.vote) votes,
  3.         u.user_id
  4.     FROM articles a
  5.     LEFT JOIN votes v
  6.         ON v.article_id = a.article_id
  7.     LEFT JOIN users u
  8.         ON u.user_id = a.user_id
  9.     GROUP BY a.user_id

Трабла тут в том, что пользак может быть удален, или у статьи может не быть ни одного голоса.
Но, если заменять на CROSS/INNER/RIGHT JOIN'ы то мы снова можем напороться на нецелостность данных и результат не будет на 100% корректным.
Ну и для одного пользака запрос будет не таким (в угоду производительности).
 
 Top
Flash_PR
Отправлено: 20 Августа, 2015 - 23:41:47
Post Id



Посетитель


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


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




DeepVarvar
DeepVarvar пишет:
Трабла тут в том, что пользак может быть удален, или у статьи может не быть ни одного голоса.


Мне в принципе надо для одного конкретного пользователя провести выборку. Если выполняется этот запрос, значит пользователь существует, т.е. это в ЛК этого пользователя будет.


-----
Умные мысли приходят тогда, когда все глупости уже сделаны...
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 21 Августа, 2015 - 00:13:16
Post Id



Активный участник


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


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




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.         SUM(v.vote) votes,
  3.         u.user_id
  4.     FROM users u
  5.     INNER JOIN articles a
  6.         ON a.user_id = u.user_id
  7.     INNER JOIN votes v
  8.         ON v.article_id = a.article_id
  9.     GROUP BY u.user_id
  10.     WHERE u.user_id = 30
 
 Top
broshurkaplus
Отправлено: 21 Августа, 2015 - 19:55:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 354
Дата рег-ции: Янв. 2011  
Откуда: Пружаны Бресткая обл. Беларусь


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




быть может изменить структуру и считать сумму голосов к материалу при добавлении гоолоса (триггер в бд например), а потом выводить уже итог. ведь лучше один раз посчитать, чем каждый раз запрашивать, тем более что при большом количестве голосов это будет накладно.
пс конечно если не требуется знать кто именно из пользователей голосовал.
 
 Top
Flash_PR
Отправлено: 22 Августа, 2015 - 01:49:45
Post Id



Посетитель


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


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




broshurkaplus пишет:
быть может изменить структуру и считать сумму голосов к материалу при добавлении гоолоса (триггер в бд например), а потом выводить уже итог. ведь лучше один раз посчитать, чем каждый раз запрашивать, тем более что при большом количестве голосов это будет накладно.

Да, вы правы, так и делаю, добавил поле которое при голосе плюсуется.

broshurkaplus пишет:
пс конечно если не требуется знать кто именно из пользователей голосовал.

Увы, заказчик хочет знать кто голосовал, поэтому писать данные по голосу все равно придется. Но это пригодится. Просто я упрощенную задачу описал, на самом деле в моей разработке за материал могут давать как "+", так и "-" Соответсвенно эти данные буду тоже выводить, количество голосов "за" и количество голосов "против" А рейтинг получается как разница голосов.


-----
Умные мысли приходят тогда, когда все глупости уже сделаны...
 
My status
 Top
broshurkaplus
Отправлено: 22 Августа, 2015 - 23:39:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 354
Дата рег-ции: Янв. 2011  
Откуда: Пружаны Бресткая обл. Беларусь


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




1 только если уж никак без знания того кто голосовал. реально заказчика надо переубедить или найти компромис.
2 +/- так считайте и количество всего проголосовавших и в базу, а "-" получаете: проголосовавших-рейтинг=сумма отрицательных голосов.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB