всем привет,
помогите плз решить проблему:
есть 3 таблицы: articles (статьи, поля id, text), ratings (рейтинги статей, поля user, value, article_id), comments (комменты к статьям, поля user, comment, article_id).
Я не могу за один раз вывести данные о статье, среднее значение рейтинга и количество комментариев.
Т.е. у меня получается сделать два таких отдельных запроса:
select articles.id, AVG(ratings.value) from articles, ratings where ratings.articles_id=articles.id group by articles.id;
select articles.id, COUNT(comments.articles_id) from articles, comments where comments.articles_id=articles.id group by articles.id;
Но как сделать это за ОДИН запрос?
Спасибо!
Что-то типа:
SELECT A.имяполя, A.ещёимяполя, R.имяполя, R.ещёимяполя, C.имяполя, V.ещёимяполя
FROM articles A, ratings R, comments C
WHERE R.articles_id=A.id AND C.articles_id=A.id
SELECT A.имяполя, A.ещёимяполя, R.имяполя, R.ещёимяполя, C.имяполя, C.ещёимяполя
FROM articles A, ratings R, comments C
WHERE R.articles_id=A.id AND C.articles_id=A.id
Здравствуйте, senplusplus, Вы писали:
S>S>select articles.id, AVG(ratings.value) from articles, ratings where ratings.articles_id=articles.id group by articles.id;
S>select articles.id, COUNT(comments.articles_id) from articles, comments where comments.articles_id=articles.id group by articles.id;
S>
S>Но как сделать это за ОДИН запрос?
А mysql поддерживает вложенные запросы?
Только если, у статьи нет ни коментов ни рейтингов, она в результат не попадет.
select
coalesce(r.articles_id, c.articles_id) articles_id,
r.avg_rating,
c.cnt_comments
from
(
select
articles_id
avg(ratings.value) avg_rating
from
ratings
group by
articles_id
) r
full join
(
select
articles_id
count(*) cnt_comments
from
comments
group by
articles_id
) c on
r.articles_id = c.articles_id
ksk пишет:
> SELECT A.имяполя, A.ещёимяполя, R.имяполя, R.ещёимяполя, C.имяполя, V.ещёимяполя
> FROM articles A, ratings R, comments C
> WHERE R.articles_id=A.id AND C.articles_id=A.id
Это как раз пример, как делать нельзя.
На вопрос "почему" можете ответить сами в виде домашнего задания.
Лучше НЕ писать в виде одного запроса.
Если надо иметь один набор данных, и сервер позволяет (MySQL — позволяет), то
select a.*, b.*
from (
select articles.id, AVG(ratings.value) from articles, ratings where
ratings.articles_id=articles.id group by articles.id ) as a
full outer join
(select articles.id, COUNT(comments.articles_id) from articles, comments where
comments.articles_id=articles.id group by articles.id) as b on a.articles.id =
b.articles.id
Возможно, full outer join можно заменить на left outer join или просто на JOIN,
в зависимости от того, где какие записи есть, а где нет, и что вам нужно получить.
Posted via RSDN NNTP Server 2.1 beta