[英]SQL with INNER JOIN for two tables using or before the second INNER JOIN
select
sld.linkid,sld.accept,scd.catid,scd.catname,scd.caturl,scd1.parentcatid
from sound_link_droos sld
INNER JOIN sound_cat_droos scd
ON sld.catid=scd.catid
OR
INNER JOIN sound_cat_droos scd1
ON sld.catid=scd1.parentcatid
WHERE accept = '1' AND scd.catname = '$catname'");
我想知道我是否可以擁有或在此陳述中,或者...如果一個內部聯接返回錯誤
sound_cat_droos
Catidcatnameparentidaccepturl 1David01http://www.example.com 2Jazz音樂11http://www.example.comsound_link_droos
linkidlinknamecatidaccepturl 1我的愛11http://www.example.com/audio.mp3 2我的孩子21http://www.example.com/audio.mp3最好的解決方案是使用“全部聯合”而不是“連接”中的“ OR”,如下所示:
select sld.linkid,sld.accept,scd.catid,scd.catname,scd.caturl,scd1.parentcatid from sound_link_droos sld
INNER JOIN sound_cat_droos scd
ON sld.catid=scd.catid
where accept = '1' and scd.catname = '$catname'
union all
select sld.linkid,sld.accept,scd.catid,scd.catname,scd.caturl,scd1.parentcatid from sound_link_droos sld
INNER JOIN sound_cat_droos scd1
ON sld.catid=scd1.parentcatid
where accept = '1' and scd1.catname = '$catname';
您可以像這樣在on
子句中表達or
邏輯:
select sld.linkid, sld.accept,s cd.catid, scd.catname, scd.caturl, scd1.parentcatid
from sound_link_droos sld inner join
sound_cat_droos scd
on sld.catid = scd.catid or sld.catid = scd.parentcatid
where accept = 1 and scd.catname = '$catname';
這樣的聯接通常是性能的殺手,這可能無法滿足您的實際需求。 如果不是,請詢問另一個有關樣本數據和所需結果的問題。
我刪除了'1'
周圍的單引號,因為我猜數值是數字。 數字應與數字進行比較。
還必須提及參數。 您不應該用參數值來修飾查詢字符串。 了解如何正確使用參數。
沒有規范,我們只能猜測查詢應該返回什么。
所以這是一個猜測。
我們得到所有_cat_
,其中catname與某個值匹配:
SELECT scd.catid
, scd.catname
, scd.caturl
FROM sound_cat_droos scd
WHERE scd.catname = 'someval'
我們知道_cat_
可以是其他_cat_
的父_cat_
。 我們還要返回那些孩子_cat_
。 這是執行此操作的查詢:
SELECT scc.catid
, scc.catname
, scc.caturl
FROM sound_cat_droos scc
JOIN sound_cat_droos scp
ON scp.catid = scc.parentcatid
WHERE scp.catname = 'someval'
我們可以使用UNION ALL集運算符將來自這兩個查詢的結果合並為一個集合。 然后,我們可以將該組合集加入_link_
SELECT sld.linkid
, sld.accept
, sca.catid
, sca.catname
, sca.caturl
FROM ( SELECT scd.catid
, scd.catname
, scd.caturl
FROM sound_cat_droos scd
WHERE scd.catname = 'someval'
UNION ALL
SELECT scc.catid
, scc.catname
, scc.caturl
FROM sound_cat_droos scc
JOIN sound_cat_droos scp
ON scp.catid = scc.parentcatid
WHERE scp.catname = 'someval'
) sca
JOIN sound_link_droos sld
ON sld.catid = sca.catid
AND sld.accept = '1'
如果重要(由於某種原因)要知道我們匹配的_cat_
是直接匹配還是與子_cat_
匹配,我們可以在內聯視圖查詢中包含一個discriminator列,並將其返回到結果集中。
SELECT sld.linkid
, sld.accept
, sca.catid
, sca.catname
, sca.caturl
, sca.src
FROM ( SELECT 1 AS src
, scd.catid
, scd.catname
, scd.caturl
FROM sound_cat_droos scd
WHERE scd.catname = 'someval'
UNION ALL
SELECT 2 AS src
, scc.catid
, scc.catname
, scc.caturl
FROM sound_cat_droos scc
JOIN sound_cat_droos scp
ON scp.catid = scc.parentcatid
WHERE scp.catname = 'someval'
) sca
JOIN sound_link_droos sld
ON sld.catid = sca.catid
AND sld.accept = '1'
我們只是在猜測需求,應該返回什么結果。 並且此查詢可能滿足您的規范。 但是我們不是那個規范。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.