help: составление "двойного" mysql запроса
От: senplusplus Россия  
Дата: 22.11.08 17:57
Оценка:
всем привет,
помогите плз решить проблему:
есть 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;


Но как сделать это за ОДИН запрос?

Спасибо!
Re: help: составление "двойного" mysql запроса
От: ksk Россия  
Дата: 24.11.08 14:57
Оценка:
Что-то типа:

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
Re[2]: Опечатко
От: ksk Россия  
Дата: 24.11.08 15:00
Оценка:
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
Re: help: составление "двойного" mysql запроса
От: Tigor Россия  
Дата: 24.11.08 15:54
Оценка:
Здравствуйте, 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
К сожалению, в действительности все выглядит иначе, чем на самом деле.
Re[2]: help: составление "двойного" mysql запроса
От: MasterZiv СССР  
Дата: 24.11.08 20:35
Оценка:
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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.