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