如何在X上左加入A到B,然后在Y上将B加到C.

时间:2012-04-09 06:38:14

标签: php mysql sql

我是世界上最新的转换为LEFT JOIN的乐趣。以下是美妙的工作:

$STH = $DBH->prepare("
SELECT cc.cat_subject, cc.cat_major, cc.cat_minor, cc.cat_name, c.cnum, c.unmod
  FROM comment_category cc 
LEFT JOIN comment c
  ON cc.cat_subject = c.cat_subject AND cc.cat_major = c.cat_major AND cc.cat_minor = c.cat_minor
ORDER BY cc.cat_subject, cc.cat_major, cc.cat_minor");

我现在想要做的是引用另一个表favourite (f),该表只有cnum的公共字段comment (c),而comment_category (cc)没有。

我尝试了以下内容:

$STH = $DBH->prepare("
SELECT cc.cat_subject, cc.cat_major, cc.cat_minor, cc.cat_name, c.cnum, c.unmod, f.favourite
FROM comment_category cc 
LEFT JOIN comment c 
  ON cc.cat_subject=c.cat_subject AND cc.cat_major=c.cat_major AND cc.cat_minor=c.cat_minor
LEFT JOIN favourite f
  ON c.cnum=f.cnum
ORDER BY cc.cat_subject, cc.cat_major, cc.cat_minor");

它不起作用。我猜测(从我读过的内容)这是因为我实际上要求另一个加入comment_category (cc)而不是comment (c)

简而言之:我如何选择A,LEFT JOIN到B,但是然后使用B中的字段来访问C中的值?

更新(由于下注不满):

表格是:

comment_category
----------------
subject   (int)
cat_major (int)
cat_minor (int)
name      (varchar)

comment
-------
cnum      (int)
subject   (int)
cat_major (int)
cat_minor (int)
unmod     (varchar)

favourite
---------
cnum      (int)

...我会在这里停止 - 因为favourite表中没有喜欢的字段而崩溃了。

我的错误。对不起,全部。

1 个答案:

答案 0 :(得分:1)

很高兴你自己想出来了。既然你说你是JOINs的新手,我确实想在你加入2个以上的表时添加它,考虑使用INNER JOIN是个好主意。不同之处在于LEFT JOIN将返回LEFT上的行(在本例中为comment_category),无论您是否在评论中匹配。 INNER JOIN不会从comment_category返回行,除非它在注释中也匹配。

在这种情况下这很重要的原因是因为为了让你在JOIN上的JOIN返回除NULL之外的任何东西,你的查询首先需要匹配comment中的comment_category中的一行。如果您对comment_category和注释使用INNER JOIN,则故障排除将不那么模糊。此外,使用INNER JOIN将消除结果中的NULL值(由JOIN不匹配产生的NULL,即)。

LEFT与INNER JOIN的使用还取决于您的业务需求。例如,如果comment_category中的所有行只需必须在注释中匹配,那么您应该使用INNER JOIN。但是,如果您查询的评论不一定要有收藏夹(但是如果有的话,您希望它们返回),那么您应该使用LEFT JOIN。希望这会有所帮助。