Mysql 如何将三个查询的结果合并为一个查询

Mysql 如何将三个查询的结果合并为一个查询,mysql,sql,Mysql,Sql,我有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

我有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

您可以使用SQL创建记录的结果集

在每个记录中,字段之间都有某种关系

现在,在您想要的输出中,我敢猜测namriaVacantPosition07 17 14b.rar、im_0710.zip和ccIlocanoVer.rar之间绝对没有关系,只是它们碰巧在同一个数据库中的某个地方,如果您将三个不相关的列表放在一起,它们碰巧出现在同一行上

如果没有逻辑上的理由来描述为什么这三件事应该出现在同一行上,那么在SQL中就没有办法做到这一点

事实上,你甚至不应该尝试这样做。你不应该想要它。从数据库中检索到三个有意义的列表,这些列表中的项目完全不相关

现在,您想要并排显示这三个列表,这是一个演示问题。做一个表格,用三列,随便什么。不要试图解决数据库中的表示问题。永远


你的数据库是关于数据的。在检索信息的方式上,无论是并排显示、一个在另一个下面显示,还是在三个不同的页面或网站上显示,都应该完全没有区别,因为这些不同的演示文稿不会改变您要检索的数据

它可以在SQL上完成,在rownum上具有完全联接。 不幸的是,MySQL不支持完全联接、行数和CTE的查询,因此查询有点复杂,但它可以工作:

select Maps,Publications,Others from
(
    select  Maps,Publications, Others from
        (
        select @r:=@r+1 as 'Num', e.* 
        from
            (
            select 
                 Maps
                ,Others 
            from
               ( 
                 SELECT 
                     @m:=@m+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:=@n+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:=@o+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:=@p+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:=@q+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:=@r1+1 as 'Num'
                ,e.* 
            from
                (
                select 
                     Maps
                    ,Others 
                from
                    ( 
                    SELECT 
                         @m1:=@m1+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:=@n1+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:=@o1+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:=@p1+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:=@q1+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”列


排序背后的逻辑是什么?为什么第0行有这些值?如果它们属于您添加的日期,那么它们就在同一行上?请尝试pivot表查询,也许这在SQL中是不自然的。您应该在应用程序端加入数据。