Mysql 如何将三个查询的结果合并为一个查询
我有3个问题: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
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中是不自然的。您应该在应用程序端加入数据。