Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите составить sql запрос

444
08 июня 2009 года
patison
323 / / 15.03.2007
Доброго дня всем.
Пол дня сидел, пытаясь сформулировать запрос. Не выходит и всё тут.
Вобщем, есть 2 таблицы:

phpbb_users:
user_id | user_rating | ...

И есть songs:
song_id | user_id | rating | ...

Задача - выбрать и показать всех юзеров с их рейтингами. Фича в том, что рейтинг юзера считается по формуле: user_rating+сумма_всех_рейтингов_его_песен (rating для песни с соответствующим user_id из songs).
Мой запрос, на данный момент вытаскивает и показывает инфу только по тем юзерам, чьи user_id есть в табле songs (то-бишь тех юзеров, кто уже залил песни).
SELECT u.*, s.*, (SUM(s.rating)+u.user_rating)as user_total_rating FROM phpbb_users u, songs s WHERE u.user_type!='2' AND u.user_id=s.user_id GROUP BY u.user_id ORDER BY user_total_rating DESC
49K
08 июня 2009 года
suff84
8 / / 08.06.2009
Может так:

SELECT u.user_id, (SUM(s.rating)+u.user_rating) AS user_total_rating
FROM phpbb_users u
LEFT JOIN songs s ON u.user_id=s.user_id
WHERE u.user_type!='2'
GROUP BY u.user_id
ORDER BY user_total_rating DESC
2
08 июня 2009 года
squirL
5.6K / / 13.08.2003
а зачем делать один сложный запрос, когда можно сделать два маленьких?
444
08 июня 2009 года
patison
323 / / 15.03.2007
squirL: например? Сначала вытащить всех тех кто есть в songs, а потом оставшихся из users? если так - то геморр. Потому что там ещё стоит LIMIT (который я не стал указывать в запросе, дабы не усложнять), и морочиться с этими кусками результатов не хочется.

suff84: То что надо! Пробовал JOIN, тока вот основной таблицей (перед left join) ставил songs. А так, добавил там ещё один ORDER - и всё работает как надо :)
9.9K
09 июня 2009 года
maxFM
77 / / 18.04.2007
Самое простое и думаю быстрое это составить два запроса.
1.
 
Код:
select user_id,sum(rating) as sum_rating from songs group by user_id

и сохранить этот запрос как rating_query
затем
 
Код:
select phpbb_users.user_id,phpbb_users.user_rating+rating_query.sum_rating
from phpbb_users pu
inner join rating_query rq on pu.user_id=rq.user_id
group by user_id

может там ошибка будет с группироской но вроде все должно заработать
8.2K
10 июня 2009 года
Ora-cool
211 / / 20.09.2007
А зачем разбивать на 2 запроса, если можно сделать все одним, при том что довольно элементарным?)
49K
11 июня 2009 года
suff84
8 / / 08.06.2009
maxFM, запрос получается такой же по сути. Только нужно не INNER JOIN, а LEFT JOIN, иначе опять пропадут users, которых нет в songs.

Дополнение к своему варианту:
Цитата: suff84
Может так:

SELECT u.user_id, (SUM(s.rating)+u.user_rating) AS user_total_rating
FROM phpbb_users u
LEFT JOIN songs s ON u.user_id=s.user_id
WHERE u.user_type!='2'
GROUP BY u.user_id
ORDER BY user_total_rating DESC



Чуть не забыл, здесь также нужно помнить, что в songs есть не все user_id из users, что может привести к появлению NULL-значений в сумме. Так что правильнее будет:

SELECT u.user_id, (ISNULL(SUM(s.rating),0)+ISNULL(u.user_rating,0)) AS user_total_rating
FROM phpbb_users u
LEFT JOIN songs s ON u.user_id=s.user_id
WHERE u.user_type!='2'
GROUP BY u.user_id
ORDER BY user_total_rating

26K
09 июля 2009 года
Neo1031
3 / / 04.03.2007
А можно я тут тоже спрошу?) :)

Вобщем запарился соображать, работаю с аксцессом первый раз, так что прошу помощи)
Есть таблица "Книжки" с двумя полями: Количество и Название. В первом прописывается сколько раз читатель брал книгу, а во втором - название этой книги.
Задача у меня в общем такая: Написать запрос на выборку книг, которые брали столько же раз, сколько, например, "Три мушкетера".

Пробовал group-ом, и прочим, но чет всё никак...:confused:
14K
10 июля 2009 года
Irene_001
43 / / 29.07.2007
Цитата: Neo1031
А можно я тут тоже спрошу?) :)
Есть таблица "Книжки" с двумя полями: Количество и Название. В первом прописывается сколько раз читатель брал книгу, а во втором - название этой книги.
Задача у меня в общем такая: Написать запрос на выборку книг, которые брали столько же раз, сколько, например, "Три мушкетера".



я бы так писала :) :

 
Код:
select * from Books b1 where exists (select number from Books b2 (where(b1.number = b2.number and b2.title="need mame"));

здесь у меня Books -- это таблица книг
number-- поле сколько раз книгу брали
title -- название книги
need mame -- соответственно нужное название
26K
11 июля 2009 года
Neo1031
3 / / 04.03.2007
WOW, it works! Понян-понян, пасибо Вам, Irene_001, буду копать подзапросы значит)) :D
51K
13 июля 2009 года
capGeadaVaf
2 / / 13.07.2009
Я что то не очень понял только вот чем тебя sort by и order by неустраивает , просто пишеь запрос а в конце например sort by id , и все у тебя по номеру остсортированы. Или может я чего то не догнал
444
13 июля 2009 года
patison
323 / / 15.03.2007
И, как это обычно бывает, спустя время - формула поменялась... И опять сижу и ломаю голову.. ступор какой-то.
Вобщем, таблицы:
та-же таблица users,
songs и новая таблица albums.

Задача - вытащить рейтинг всех юзеров согласно след формуле:
user_raiting = сумма_рейтингов_всех_песен_конкретного_стиля + сумма_рейтингов_альбомов_конкретного_стиля.

Запрос пока что такой:
 
Код:
SELECT u.user_id as user_real_id, ( IFNULL(SUM(DISTINCT s.rating),0) + IFNULL( SUM(DISTINCT a.rating),0 )) as user_total_rating FROM users u, songs s, albums a WHERE s.user_id=u.user_id AND a.user_id=u.user_id AND a.style_id='3' AND s.style_id='3' GROUP BY u.user_id ORDER BY user_total_rating DESC LIMIT 0,10

Прикол в том, что вытаскиваются только те id юзеров и их рейтинги, у которых есть песни с style_id=3 И альбомы с style_id=3 . Если-же у юзера есть только песни, а альбомов нету (или наоборот) - их не вытаскивает.
Это-то и логично, т.к. стоит условие a.style_id='3' AND s.style_id='3' , однако это условие больше нужно для подсчёта нужных SUM... Опять-таки всё это дело надо реализовать одним единственным запросом.
385
15 июля 2009 года
SomewherSomehow
477 / / 25.07.2004
Более того приведенный выше запрос еще и суммы неправильно посчитает даже если у пользователей будут записи и в таблице альбомы и в таблице песни, т.к. декартово произведение таблиц, будет сочетать каждую строку с каждой в результате чего при подсчете суммы для каждого пользователя по колонке рейтинг значение суммы увеличится пропорционально кол-ву строк в таблицах альбомы и песни для этого пользователя.
По-моему тут без подзапросов никак.
Не знаю позволяет ли ваша субд так делать, но я бы написал такой запрос в MS SQL вот так:
Код:
declare @users table(user_id int, user_rating int)
declare @songs table(song_id int, user_id int, style_id int, rating int)
declare @albums table(album_id int, user_id int, style_id int, rating int)

select
    u.user_id,
    u.user_rating + isnull(s.rating,0) + isnull(a.rating,0)
from
    @users u
    left outer join
    (
        select s.user_id, SUM(s.rating) as rating from @songs s where s.style_id='3' group by s.user_id
    ) s on (u.user_id = s.user_id)
    left outer join
    (
        select a.user_id, SUM(a.rating)as rating from @albums a  where a.style_id='3' group by a.user_id
    ) a on (u.user_id = a.user_id)
444
15 июля 2009 года
patison
323 / / 15.03.2007
Сочетания каждой строки с каждой не произойдёт, там ведь стоит условие - суммировать рейтинги определённых песен и альбомов.

В итоге всё разрешилось следующим запросом:
 
Код:
SELECT u.user_id as user_real_id, ( IFNULL(SUM(DISTINCT s.rating),0) + IFNULL( SUM(DISTINCT a.rating),0 )) as user_total_rating
FROM users u
LEFT JOIN songs s ON s.style_id='3' AND s.user_id=u.user_id
LEFT JOIN albums a ON a.style_id='3' AND a.user_id=u.user_id
GROUP BY u.user_id
ORDER BY user_total_rating DESC
385
15 июля 2009 года
SomewherSomehow
477 / / 25.07.2004
Ну если гарантируется что значения поля рейтинг уникальны, то оно конечно возможно...но вот если рейтинги песен ведутся или будут вестись в рамках какой либо группы, например "альбома" или "жанра" или "по версии...", будет то что сказао выше...
444
15 июля 2009 года
patison
323 / / 15.03.2007
Не, в том-то и дело что рейтинг Всегда будет считаться отдельно для каждого юзера по той схеме которую я описывал выше
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог