2013-03-06 76 views
0

这是我有:加入两部分的SQL查询到一个查询

查询

select 
bc.short_desc as cdesc 
from 
blog_post as bp 
left join blog_post_category_link as blpc on bp.post_id = blpc.post_id 
inner join blog_category as bc on blpc.cat_id = bc.cat_id 
where bp.post_id = 1 

结果

---------------- 
| |cdesc  | 
---------------- 
|1|Top level | 
---------------- 
|2|Sub level | 
---------------- 
|3|SubSub level| 
---------------- 

第二个查询

select 
bt.short_desc as tdesc 
from 
blog_post as bp 
left join blog_post_tag_link as blpt on bp.post_id = blpt.post_id 
inner join blog_tag as bt on blpt.tag_id = bt.tag_id 
where bp.post_id = 1 

第二个结果

---------------- 
| |tdesc  | 
---------------- 
|1|Tag1  | 
---------------- 
|2|Tag2  | 
---------------- 

加入这两个查询

---------------------- 
| |cdesc  |tdesc| 
---------------------- 
|1|Top level |Tag1 | 
---------------------- 
|2|Sub level |Tag2 | 
---------------------- 
|3|SubSub level|  | 
---------------------- 

是否有可能在之后的所有期望的结果?

回答

2

尝试此查询

SET @rn1 = 0; 
SET @rn2 = 0; 

SELECT t1.rId, t1.cdesc, t2.tdesc 
FROM 
(select @rn1 := rn1 + 1 AS rId, bc.short_desc as cdesc 
from blog_post as bp 
left join blog_post_category_link as blpc on bp.post_id = blpc.post_id 
inner join blog_category as bc on blpc.cat_id = bc.cat_id 
where bp.post_id = 1) t1, 
(select @rn2 := rn2 + 1 AS rId, bt.short_desc as tdesc 
from blog_post as bp 
left join blog_post_tag_link as blpt on bp.post_id = blpt.post_id 
inner join blog_tag as bt on blpt.tag_id = bt.tag_id 
where bp.post_id = 1) t2 
WHERE t1.rId = t2.rId; 

对于MS SQL服务器

SELECT t1.rId, t1.cdesc, t2.tdesc 
FROM 
(select row_number() over(order by bp.post_id) AS rId, bc.short_desc as cdesc 
from blog_post as bp 
left join blog_post_category_link as blpc on bp.post_id = blpc.post_id 
inner join blog_category as bc on blpc.cat_id = bc.cat_id 
where bp.post_id = 1) t1, 
(select row_number() over(order by bp.post_id) AS rId, bt.short_desc as tdesc 
from blog_post as bp 
left join blog_post_tag_link as blpt on bp.post_id = blpt.post_id 
inner join blog_tag as bt on blpt.tag_id = bt.tag_id 
where bp.post_id = 1) t2 
WHERE t1.rId = t2.rId; 
+0

是不是'mysql'?我得到错误“附近的语法不正确:'' – Morpheus 2013-03-06 10:04:27

+0

它是为MySQL ..我已经在小提琴中测试它。 – Meherzad 2013-03-06 10:07:00

+0

Pl发布完整的错误。 – Meherzad 2013-03-06 10:09:25

0

使用该模板,只需插入从上面的查询作为子查询的T1和T2:

Select * 
from ( 
) T1 
join ( 
) T2 on T2.tdesc = T1.cdesc and T2.Tag1 = T1.TopLevel and T2.Tag2 = T1.SubLevel 
+0

谢谢你的建议。 “标签1,顶级”等是可以编辑和添加的随机名称。可以是成百上千的。 – Morpheus 2013-03-06 09:38:00

+0

您正在加入数百或数千个未知领域?怎么可能?然后,我只是误解了;用两个子查询替换实际的连接字段名称。 – 2013-03-06 09:42:11

0
SELECT 
bc.short_desc AS cdesc, bt.short_desc AS tdesc 
FROM 
blog_post AS bp 
LEFT JOIN blog_post_category_link AS blpc ON bp.post_id = blpc.post_id 
INNER JOIN blog_category AS bc ON blpc.cat_id = bc.cat_id 
LEFT JOIN blog_post_tag_link AS blpt ON bp.post_id = blpt.post_id 
INNER JOIN blog_tag AS bt ON blpt.tag_id = bt.tag_id 
WHERE bp.post_id = 1 
+0

这将返回=> 1 |顶级| Tag2,2 |顶级| Tag1,3 | Sub级别| Tag2,4 | Sub级别| Tag1,5 | SubSub级别| Tag2,6 | SubSub级别| Tag1' – Morpheus 2013-03-06 09:48:02

+0

@ Morpheus哦,对,你只是想列出它们...所以我认为你需要告诉什么分贝然后。 – 2013-03-06 09:52:09