Есть таблица УСТРОЙСТВА, есть таблица ПРОШИВКИ, есть таблица БАГИ, между ними есть связывающие таблицы.
Между таблицами УСТРОЙСТВА и ПРОШИВКИ есть связывающая таблица УСТРОЙСТВА_ИМЕЮЩИЕ_ПРОШИВКИ т.е. одно устройство может иметь много прошивок.
Между таблицами ПРОШИВКИ и БАГИ есть связывающая таблица ПРОШИВКИ_ИМЕЮЩИЕ_БАГИ т.е. одна прошивка может иметь много багов.
Но БАГИ у нас не простые. Баги могут быть баги а могут быть примечания. За это отвечает специальный флаг is_bug в таблице багов.
Теперь, надо сделать такое:
Надо подсчитать сколько у нас для каждой прошивки конкретного устройства есть багов а сколько примечаний.
У меня запрос такой:
select distinct
t_device_firmware.firmware_version
, COUNT( t_bug_list.is_bug )
from
t_bug_list
,t_device_firmware
,r_firmware_has_bug_list
,r_device_has_firmware
where
(
r_device_has_firmware.id_device = 4213 /*номер устройства*/AND
r_device_has_firmware.id_device_firmware = t_device_firmware.id_device_firmware
AND
r_firmware_has_bug_list.id_firmware = t_device_firmware.id_device_firmware
AND
t_bug_list.id_bug = r_firmware_has_bug_list.id_bug
)
AND
(
t_bug_list.is_bug = 1
OR
t_bug_list.is_bug = 0
)
group by t_bug_list.is_bug
У тебя запрос возвращает всего два параметра
N>select distinct
N> t_device_firmware.firmware_version ----раз N> , COUNT( t_bug_list.is_bug ) ----два
а ты хочешь чтоб он три возвращал,
что за СУБД или это файл сервер если СУБД то проще используй хранимую процедуру, если файл сервер, то
одним запросом не обойдёшся, это опираясь на мои знания.
Запрос немного странный, смущает отсутствие group by t_device_firmware.firmware_version. И если сервер поддерживает, зачем условия join в where переносить?
Я думаю надо так:
select t_device_firmware.firmware_version
,sum(case when t_bug_list.is_bug = 1 then 1 else 0 end ) bugs
,sum(case when t_bug_list.is_bug = 0 then 1 else 0 end ) [not bugs]
from
t_bug_list
,t_device_firmware
,r_firmware_has_bug_list
,r_device_has_firmware
where
(
r_device_has_firmware.id_device = 4213 /*номер устройства*/AND
r_device_has_firmware.id_device_firmware = t_device_firmware.id_device_firmware
AND
r_firmware_has_bug_list.id_firmware = t_device_firmware.id_device_firmware
AND
t_bug_list.id_bug = r_firmware_has_bug_list.id_bug
)
group by t_device_firmware.firmware_version
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам
ого!
case, than, else... круто, это то чего мне не хватало. Удобно блин.
Только вот интересно потянет ли на MySQL 5.0 сервере?
Ткните plz в литературу по SQL.
Здравствуйте, nen777w, Вы писали:
N>ого! N>case, than, else... круто, это то чего мне не хватало. Удобно блин. N>Только вот интересно потянет ли на MySQL 5.0 сервере? N>Ткните plz в литературу по SQL.
Про MySql в условии задачи ничего сказано не было. Не всегда возможно по коду угадать, какой сервер используется.
Так что извиняйте если не потянет )
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам
Sshur wrote:
> Можно без двукратного присоединения t_bug_list обойтись.
Можно... но не факт, что then/else будет работать быстро. Надо экспериментировать.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай