使用INNER JOIN的SQL在第二个INNER JOIN之前或之前使用两个表

时间:2017-11-07 14:31:38

标签: mysql sql

    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'");

我想知道我是否可以拥有或在此声明或...如果一个内部联接返回fals

sound_cat_droos

Catidcatnameparentidaccepturl 1David01http://www.example.com中 2Jazz music11http://www.example.com

sound_link_droos

linkidlinknamecatidaccepturl 1my love11http://www.example.com/audio.mp3 2my baby 21http://www.example.com/audio.mp3

3 个答案:

答案 0 :(得分:1)

最佳解决方案是在Join中使用Union all而不是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';

答案 1 :(得分:1)

您可以在or子句中表达on逻辑,如下所示:

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'周围的单引号,因为我猜测该值是数字。应将数字与数字进行比较。

提及参数也是必须的。您不应该使用参数值来修改查询字符串。了解如何正确使用参数。

答案 2 :(得分:0)

如果没有规范,我们只能猜测查询应返回的内容。

所以这是一个猜测。

我们得到catname匹配某些值的所有_cat_

  SELECT scd.catid
       , scd.catname
       , scd.caturl
    FROM sound_cat_droos scd 
   WHERE scd.catname = 'someval' 

我们知道_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_匹配,我们可以包含一个鉴别列在内联视图查询中,并在结果集中返回该查询。

  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'

我们只是猜测要求,应该返回什么结果。此查询可能符合您的规范。但我们不知道那个规范是什么。