Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с запросом, Непонятный результат 
V
    Опции темы
KgCoder
Дата 8.6.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 6.3.2008
Где: KGstan

Репутация: нет
Всего: нет



Есть таблицы:
`subjects` (`id`, `title`)
`exams` (... `subject`)
`questions` (... `subject`)

Делаю такой запрос:
Код

SELECT `s`.`id`, `s`.`title`, COUNT(`e`.`id`) `exams`, COUNT(`q`.`id`) `questions`
FROM `subjects` `s`
LEFT JOIN `exams` `e` ON `e`.`subject` = `s`.`id`
LEFT JOIN `questions` `q` ON `q`.`subject` = `s`.`id`
GROUP BY `s`.`id`



id = 7
title = 030301.65 Психология
exams = 3
questions = 3

Проблема в том что запись в таблице `exams` всего одна.
Добавил еще один запись и результат вообще запутал:

id = 7
title = 030301.65 Психология
exams = 6
questions = 6

Теперь еще и вопросы увеличились... а их всего три.... помогите разобраться. Кстати на локалке почему-то всё нормально работает.

Это сообщение отредактировал(а) KgCoder - 8.6.2009, 14:51
PM MAIL   Вверх
Neox_GeForce
Дата 8.6.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 14.11.2007
Где: Украина

Репутация: нет
Всего: нет



почему
Код

 left join

 а He 
Код

inner join


отредактируй сообщение типа 
Код

select
from
join
join
group by

а то не влазится

Это сообщение отредактировал(а) Neox_GeForce - 8.6.2009, 13:28


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
KgCoder
Дата 8.6.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 6.3.2008
Где: KGstan

Репутация: нет
Всего: нет



Попробовал INNER... ничего не изменилось.
PM MAIL   Вверх
skyboy
Дата 8.6.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



у тебя на каждый уникальный s.id приходится один e.id, на каждый уникальный e.id приходится 3 q.id
получается следующая выборка:
    s.id    e.id    q.id
    1    2    67
    1    2    69
    1    2    73
естественно, если это сгруппировать по s.id, то получим count(e.id) = 3 и count(q.id) = 3
решение этой проблемы зависит от используемой СУБД, точнее от возможностей диалекта SQL конкретной, используемой тобою СУБД. которую ты не указал.
решение для MySQL(жаль, что не знаком с sybase - принципиально указал бы решение для sybase)
если тебе надо, чтоб был подсчет уникальных значений e.id, то вставь в count ещё distinct. тогда будет подсчет только уникальных значений. то есть count(distinct e.id) для приведенного мной результата выдаст "1".
PM MAIL   Вверх
KgCoder
Дата 8.6.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 6.3.2008
Где: KGstan

Репутация: нет
Всего: нет



Решил через такой запрос:
Код

SELECT `s`.`id` , `s`.`title` , COUNT( DISTINCT `e`.`id` ) `exams` , COUNT( DISTINCT `q`.`id` ) `questions` 
FROM `subjects` `s` 
LEFT JOIN `exams` `e` ON `e`.`subject` = `s`.`id` 
LEFT JOIN `questions` `q` ON `q`.`subject` = `s`.`id` 
GROUP BY `s`.`id`


Добавлено: skyboy, Спасибо! Полчаса читал информацию по JOIN... smile

Это сообщение отредактировал(а) KgCoder - 8.6.2009, 15:12
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.