2014-09-17 3 views
1

У меня есть 3 запросов:Как объединить результаты трех запросов в один

SELECT If(((cat_id = 9) or (cat_id = 5)),url_download,"") as Maps 
FROM `b96e8_jdownloads_files` 
where cat_id not in (7,8,4,0,12,10,11) 
order by date_added DESC 


SELECT If(((cat_id = 11) OR (cat_id = 10)),url_download,"") as Publications 
FROM `b96e8_jdownloads_files` 
where cat_id not in (7,8,4,9,5,12,0) 
order by date_added DESC 

select If(cat_id = 12,url_download,"") as Others 
FROM `b96e8_jdownloads_files` 
where cat_id not in (7,8,4,0,10,11,5,9) 
order by date_added DESC 

Я хочу, чтобы объединить их, чтобы достичь этого результата. так что я могу просто получить данные из таблицы и вывести ее.

|    Maps    |   Publications  |    Others   | 
    -------------------------------------------------------------------------------------------- 
    im_0709.zip      | Annual Report 2009.rar |  ccIlonggoVer.rar 
    namriaVacantPosition07 17 14b.rar |    im_0710.zip |  ccIlocanoVer.rar 
    namriaVacantPosition6 27 14.rar |    im_1208.zip |  ccFilipinoVer.rar 
    namriaVacantPosition5 15 14.rar |    im_0807.zip |  BRP Brochure.rar 
            |       |  brochureNamria.rar 
            |       |  brochureGTC.rar 
            |       |  Severe Wind.rar 
            |       |  Ground Shaking.rar 
            |       |  Flood.rar 

однако, когда я попытался объединить три запроса с помощью этого запроса

SELECT file_title, If(((cat_id = 9) or (cat_id = 5)),url_download,"") as Maps, 
If(((cat_id = 11) OR (cat_id = 10)),url_download,"") as Publications, 
If(cat_id = 12,url_download,"") as Others 
FROM `b96e8_jdownloads_files` 
where cat_id not in (7,8,4,0) 
order by date_added DESC 

я получаю этот выход

|    Maps    |   Publications  |    Others   | 
-------------------------------------------------------------------------------------------- 
     NULL      |     NULL |  ccIlonggoVer.rar 
     NULL      |     NULL |  ccIlocanoVer.rar 
     NULL      |     NULL |  ccFilipinoVer.rar 
     NULL      |     NULL |  BRP Brochure.rar 
            |       |  brochureNamria.rar 
            |       |  brochureGTC.rar 
            |       |  Severe Wind.rar 
            |       |  Ground Shaking.rar 
            |       |  Flood.rar 
        NULL   | Annual Report 2009.rar |  NULL 
       im_0709.zip  |     NULL |  NULL 
        NULL   |    im_0710.zip |  NULL 
        NULL   |    im_1208.zip |  NULL 
        NULL   |    im_0807.zip |  NULL 
namriaVacantPosition07 17 14b.rar |     NULL |  NULL 
namriaVacantPosition06 27 14.rar |     NULL |  NULL 
namriaVacantPosition05 15 14.rar |     NULL |  NULL 
+0

Что логика упорядочения и почему строка 0 имеет эти значения? Это если они принадлежат к дню date_added, что они находятся в одной строке? –

+0

попробуйте выполнить сводную таблицу, возможно, она поможет –

+0

Это не является естественным в SQL.Вы должны присоединиться к данным со стороны приложения. – JotaBe

ответ

0

вы используете SQL для создания результирующего набора записей.

В каждой записи поля имеют некоторое отношение друг к другу.

Теперь на нужном выходе, я смею предположить, что namriaVacantPosition07 17 14b.rar, im_0710.zip и ccIlocanoVer.rar не имеют абсолютно не отношение друг к другу, за исключением того, что они происходят где-то в той же базе данных, и совпадению случаются появляться на в той же строке, если вы поместите три несвязанных списка рядом друг с другом.

Если нет логической причины для описания того, почему эти три вещи должны появляться в одной строке, тогда в SQL нет способа сделать это.

И действительно, вы должны не даже попытаться сделать это. Вы не должны этого хотеть. Есть три значимых списка, которые вы извлекаете из своей БД, и элементы в этих списках полностью не связаны.

Теперь вы хотите дисплей Три списки бок о бок, то есть представление вопрос. Сделайте таблицу, используйте три столбца, что угодно. Не пытайтесь решить проблемы с выпуском в вашей базе данных. Когда-либо.

Вы используете базу данных около данные. Не должно быть никакой разницы в том, как вы извлекаете свою информацию, хотите ли вы отображать три списка бок о бок, один под другим или на трех разных страницах или веб-сайтах, потому что эти разные презентации меняют ничего о данные, которые вы хотите получить!

0

Это можно сделать на SQL с полным соединением на rownum. К сожалению, MySQL не поддерживает полные соединения, row_number() над и, следовательно, запросом CTE является немного сложным, но это работает:

select Maps,Publications,Others from 
(
    select Maps,Publications, Others from 
     (
     select @r:[email protected]+1 as 'Num', e.* 
     from 
      (
      select 
       Maps 
       ,Others 
      from 
       ( 
       SELECT 
        @m:[email protected]+1 as 'Num' 
        ,d.fname as 'Maps' 
       from df d 
       cross join (select @m:=0) t 
       where cat_id="M" 
       order by db 
       ) maps 
      left join 
       (
       SELECT 
        @n:[email protected]+1 as 'Num' 
        ,d.fname as 'Others' 
       from df d 
       cross join (select @n:=0) t 
       where cat_id="O" order by db 
       ) others on maps.Num=others.Num 
      union all 
      select 
       Maps 
       ,Others 
      from 
       (
       SELECT 
        @o:[email protected]+1 as 'Num' 
        ,d.fname as 'Maps' 
       from df d 
       cross join (select @o:=0) t 
       where cat_id="M" 
       order by db 
       ) maps 
      right join 
        (
        SELECT 
         @p:[email protected]+1 as 'Num' 
         ,d.fname as 'Others' 
        from df d 
        cross join (select @p:=0) t 
        where cat_id="O" 
        order by db 
        ) others on maps.Num=others.Num 
      where maps.Num is null 
      )e 
      cross join (select @r:=0) t 
     )x 
     left join 
       (
       SELECT 
        @q:[email protected]+1 as 'Num' 
        ,d.fname as 'Publications' 
       from df d 
       cross join (select @q:=0) t 
       where cat_id="P" 
       order by db 
       ) pubs on pubs.Num=x.Num 
     union all 
     select 
      Maps 
      ,Publications 
      ,Others 
     from 
      (
      select 
       @r1:[email protected]+1 as 'Num' 
       ,e.* 
      from 
       (
       select 
        Maps 
        ,Others 
       from 
        ( 
        SELECT 
         @m1:[email protected]+1 as 'Num' 
         ,d.fname as 'Maps' 
        from df d 
        cross join (select @m1:=0) t 
        where cat_id="M" 
        order by db 
        ) maps 
        left join 
         (SELECT 
          @n1:[email protected]+1 as 'Num' 
          ,d.fname as 'Others' 
         from df d 
         cross join (select @n1:=0) t 
         where cat_id="O" 
         order by db 
         ) others on maps.Num=others.Num 
       union all 
       select 
        Maps 
        ,Others 
       from 
        (
        SELECT 
         @o1:[email protected]+1 as 'Num' 
         ,d.fname as 'Maps' 
        from df d 
        cross join (select @o1:=0) t 
        where cat_id="M" 
        order by db 
        ) maps 
       right join 
         (
         SELECT 
          @p1:[email protected]+1 as 'Num' 
          ,d.fname as 'Others' 
         from df d 
         cross join 
          (select @p1:=0) t 
         where cat_id="O" 
         order by db 
         ) others on maps.Num=others.Num 
       where maps.Num is null 
       )e 
       cross join (select @r1:=0) t 
      )z 
      right join 
        (
        SELECT 
         @q1:[email protected]+1 as 'Num' 
         ,d.fname as 'Publications' 
        from df d 
        cross join (select @q1:=0) t 
        where cat_id="P" 
        order by db 
        ) pubs on pubs.Num=z.Num 
      where z.Num is null 
)y 

полное соединение заменено левыми и правый присоединиться к союзу всех (с чудовищными накладными расходами) , столбец dt эмулирует столбец «date_added».

http://sqlfiddle.com/#!2/e0afe/42

Смежные вопросы