SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 29.10.2009 19:44:41

krasava
Участник
Зарегистрирован: 18.04.2009
Сообщений: 8

Не работает запрос

собственно вот запрос в базу вдаваться не надо, проблема в том, что 2 count не правильно выполняются. убираешь один и всё правильно а вдвоём неправильно sad

SELECT
tuses.caption, 
tuses.date,
clubs.name,
comics.image,
comics.id as comics_id,
ifnull(count(comments.id),0) AS comment,
ifnull(avg(rating.rate),0) AS rateval,
ifnull(count(rating.id),0) AS golosov
FROM clubs
INNER JOIN tuses ON tuses.id_club=clubs.id
INNER JOIN comics ON comics.id_tusa=tuses.id
LEFT JOIN comments ON comments.id_comics=comics.id
LEFT JOIN rating ON rating.id_comics=comics.id
GROUP BY clubs.name, tuses.caption, comics.image
order by rateval desc

Неактивен

 

#2 29.10.2009 20:16:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Не работает запрос

Что-то не пойму, что значит "не правильно работает" wink
Приведите примеры выборки что-ль.

Неактивен

 

#3 30.10.2009 01:17:03

krasava
Участник
Зарегистрирован: 18.04.2009
Сообщений: 8

Re: Не работает запрос

кратко:

clubs -(Один ко многим)>tuses -(Один ко многим)> comics
comics -(Один ко многим)> comments
comics -(Один ко многим)> rating

clubs поля (id, name )
tuses поля (id, id_club, name)
comics поля (id, id_tusa, caption )
comments поля (id, id_comics, name, text)
rating поля (id, id_comics, rate)

нужно одним запросом выбрать таблицу всех комиксов с полями:
к какой тусе он относится,
к какому клубу относится данная туса
+ количество коментариев относящихся к данному комиксу
+ среднеарифметический рейтинг
+ количество голосовавших

Исходный мой код запроса в первом моем посте. Помогите, моя не понимать.

Неактивен

 

#4 30.10.2009 17:11:24

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не работает запрос

А что значит «неправильно выполняется»? Примеры выборки приведите, пожалуйста smile
Наша тоже не понимать, что есть неправильного, синтаксис, вроде, нормальный smile

Неактивен

 

#5 01.11.2009 23:40:11

krasava
Участник
Зарегистрирован: 18.04.2009
Сообщений: 8

Re: Не работает запрос

1 пример: в базе: 2 комментария и 2 голоса, а он выбирает 4 комментария и 4 голоса
2 пример: в базе 0 комментариев и 2 голоса, выборка 0 комментариев и 2 голоса
3 пример: в базе 2 коментария и 1 голос, выбирает 2 комментария и 2 голоса

незнаю в чем проблема sad

Неактивен

 

#6 02.11.2009 00:24:20

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не работает запрос

Я правильно понимаю, что проблема следующая?
1. Есть comics (c), у каждого из них может быть несколько comments (m) и несколько rating (r).
2. В случае, когда Вы делаете SELECT COUNT(m) FROM c JOIN m GROUP BY c, выдается правильно.
3. В случае, когда Вы делаете SELECT COUNT(r) FROM c JOIN r GROUP BY c, выдается правильно.
4. В случае, когда Вы делаете SELECT COUNT(m) FROM c JOIN m JOIN r GROUP BY c, выдается «неправильно».

Если так, то нужно понять лишь чем отличается случай 4 от случая 2: он отличается
добавлением лишнего JOIN, который в случае таблицы длиной более 1 строки дублирует
строки (для этого и JOIN), а Вы не группируете по образующимся дублям.
Попробуйте выбрать данные без сумм и группировок вообще, Вы поймете, о чем я говорю.

Соответственно, чтобы сделать правильные выборки, можно или пойти путём подзапросов,
или путем нескольких выборок. Думаю, подзапросы Вас устроят больше:
SELECT ..., (SELECT COUNT(m) FROM m WHERE c = x.c), ...
FROM comics x

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson