Как составить запрос
От: nen777w  
Дата: 20.02.08 16:40
Оценка:
Есть таблица УСТРОЙСТВА, есть таблица ПРОШИВКИ, есть таблица БАГИ, между ними есть связывающие таблицы.
Между таблицами УСТРОЙСТВА и ПРОШИВКИ есть связывающая таблица УСТРОЙСТВА_ИМЕЮЩИЕ_ПРОШИВКИ т.е. одно устройство может иметь много прошивок.
Между таблицами ПРОШИВКИ и БАГИ есть связывающая таблица ПРОШИВКИ_ИМЕЮЩИЕ_БАГИ т.е. одна прошивка может иметь много багов.
Но БАГИ у нас не простые. Баги могут быть баги а могут быть примечания. За это отвечает специальный флаг 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


но результат имеет вид

имя_прошивки число_багов
имя_прошивки число_примечений

а хотелось бы что бы имя прошивки не повторялось а резуль тат был такой
имя_прошивки число багов число_примечаний
Re: Как составить запрос
От: neckt0  
Дата: 20.02.08 17:05
Оценка:
У тебя запрос возвращает всего два параметра

N>select distinct


N> t_device_firmware.firmware_version ----раз

N> , COUNT( t_bug_list.is_bug ) ----два

а ты хочешь чтоб он три возвращал,
что за СУБД или это файл сервер если СУБД то проще используй хранимую процедуру, если файл сервер, то
одним запросом не обойдёшся, это опираясь на мои знания.
Re: Как составить запрос
От: . Великобритания  
Дата: 20.02.08 18:51
Оценка:
nen777w wrote:

> У меня запрос такой:

Совсем ерунда какая-то, особенно это прикалывает " t_bug_list.is_bug = 1 OR t_bug_list.is_bug = 0".

 select
 
       t_device_firmware.firmware_version
       , COUNT( bug1.id_bug )
       , COUNT( bug2.id_bug )
 from
      t_device_firmware
      ,r_firmware_has_bug_list
      ,r_device_has_firmware
      left join t_bug_list bug1
          on t_bug_list.id_bug = r_firmware_has_bug_list.id_bug and t_bug_list.is_bug = 0
      left join t_bug_list bug2
          on t_bug_list.id_bug = r_firmware_has_bug_list.id_bug and t_bug_list.is_bug = 1
 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
      )
group by t_device_firmware.firmware_version
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Как составить запрос
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 21.02.08 07:26
Оценка:
Здравствуйте, nen777w, Вы писали:


Запрос немного странный, смущает отсутствие 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
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[2]: Как составить запрос
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 21.02.08 07:27
Оценка:
Здравствуйте, ., Вы писали:


Можно без двукратного присоединения t_bug_list обойтись.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[2]: Как составить запрос
От: nen777w  
Дата: 21.02.08 07:40
Оценка:
ого!
case, than, else... круто, это то чего мне не хватало. Удобно блин.
Только вот интересно потянет ли на MySQL 5.0 сервере?
Ткните plz в литературу по SQL.
Re[3]: Как составить запрос
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 21.02.08 07:48
Оценка:
Здравствуйте, nen777w, Вы писали:

N>ого!

N>case, than, else... круто, это то чего мне не хватало. Удобно блин.
N>Только вот интересно потянет ли на MySQL 5.0 сервере?
N>Ткните plz в литературу по SQL.


Про MySql в условии задачи ничего сказано не было. Не всегда возможно по коду угадать, какой сервер используется.

Так что извиняйте если не потянет )
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[3]: Как составить запрос
От: . Великобритания  
Дата: 21.02.08 08:19
Оценка:
Sshur wrote:

> Можно без двукратного присоединения t_bug_list обойтись.

Можно... но не факт, что then/else будет работать быстро. Надо экспериментировать.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.