簡體   English   中英

使用第二個INNER JOIN或之前的兩個表的帶有INNER JOIN的SQL

[英]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.com

sound_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM