Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Проблема с запросом


Автор: KgCoder 8.6.2009, 12:23
Есть таблицы:
`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

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

Автор: Neox_GeForce 8.6.2009, 13:27
почему
Код

 left join

 а He 
Код

inner join


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

select
from
join
join
group by

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

Автор: KgCoder 8.6.2009, 14:49
Попробовал INNER... ничего не изменилось.

Автор: skyboy 8.6.2009, 15:08
у тебя на каждый уникальный 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".

Автор: KgCoder 8.6.2009, 15:09
Решил через такой запрос:
Код

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)