select с двух таблиц.

0xHH

Новичок
select с двух таблиц.

Есть две таблицы: message(messageid, text), comment(commentid, messageid, text).

Надо получить messageid, count(commentid).

group by отдаёт только сообщения, у которых есть comment.

Как получить все значения messageid?

-~{}~ 20.07.06 21:27:

select m.messageid, count(c.commentid)
from message m left outer join comment c
on m.messageid = c.messageid
group by m.messageid
 

zarus

Хитрожопый макак
[sql]
SELECT m.message_id, IFNULL(t.count,0)
FROM
messages as m
LEFT JOIN
(SELECT message_id, count(comment_id) as count FROM comments GROUP BY message_id) as t
ON (m.message_id = t.message_id)
[/sql]
?
 

0xHH

Новичок
Пытался объеденить 3 таблицы join-ами. В результате неправильно считается sum(a.rating).

[sql]select m.*, sum(a.rating), count(c.comment_id) from message m
left outer join accountmessagerating a on
m.message_id=a.message_id
left join accountmessagecomment c on
m.message_id=c.message_id
group by m.message_id[/sql]

Как правильно написать запрос. Маны не особо помогли. :(
 

zerkms

TDD infected
Команда форума
В результате неправильно считается
считается оно всегда правильно...

значит ты хочешь одного, а запрашиваешь другое.

Как правильно написать запрос
взять и написать. для этого сначала нужно найти почему он считает неправильно, и это самое "почему" устранить
 

0xHH

Новичок
zerkms
Мне от Вашего комментария особо легче не стало. Спасибо. :)
 

Serg Karpenko

Новичок
Если хочется одним запросом, то можно так:

SELECT
m.* ,
select sum( rating ) from accountmessagerating where message_id = m.message_id,
select count( comment_id ) from accountmessagecomment where message_id = m.message_id
FROM message m
 

0xHH

Новичок
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select sum( rating ) from accountmessagerating where message_id

-~{}~ 22.07.06 14:29:

Serg Karpenko

Фантастика :)

Расставил скобки, всё заработало.
 

zerkms

TDD infected
Команда форума
0xHH
а потом, когда ты подрастёшь и научишься делать explain - ты посмотришь на этот запрос и возьмёшься за голову
 

0xHH

Новичок
zerkms
По отдельности join-ы работают. Вместе дают фигню.
 

zerkms

TDD infected
Команда форума
0xHH
просто так mysql тебе ничего не даёт. если ты получаешь фигню - значит ты и запрашиваешь фигню. если бы ты повнимательнее посмотрел в запрос и данные, потом выполнил аналогичные запросу действия вручную, то нашёл бы ошибку
 

0xHH

Новичок
Мне говорят, что невозможно, т.к. группировка и нельзя исп 2 агрегатных ф-ии в одном селекте. Можно выполнить только двумя запросами.
 

Serg Karpenko

Новичок
выше zarus писал для одного джойна,
но для двух тоже должно работать:

select m.*, t1.sum_rating, t2.cnt_comment from message m
left join
( SELECT message_id , count( comment_id ) as cnt_comment FROM message GROUP BY message_id ) t1 on (m.message_id = t1.message_id)
left join (
( SELECT message_id , sum( rating ) as sum_rating FROM message GROUP BY message_id ) t2 on (m.message_id = t2.message_id)

Что с производительностью у такого варианта я не знаю.
ИМХО проще на php объединить результаты двух запросов.
 

0xHH

Новичок
Serg Karpenko
Мне предложили вычисляемые поля вносить в таблицу ради уменьшения нагрузки на сервер.
 
Сверху