我是世界上最新的转换为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
表中没有喜欢的字段而崩溃了。
我的错误。对不起,全部。
答案 0 :(得分:1)
在这种情况下这很重要的原因是因为为了让你在JOIN上的JOIN返回除NULL之外的任何东西,你的查询首先需要匹配comment中的comment_category中的一行。如果您对comment_category和注释使用INNER JOIN,则故障排除将不那么模糊。此外,使用INNER JOIN将消除结果中的NULL值(由JOIN不匹配产生的NULL,即)。
LEFT与INNER JOIN的使用还取决于您的业务需求。例如,如果comment_category中的所有行只需必须在注释中匹配,那么您应该使用INNER JOIN。但是,如果您查询的评论不一定要有收藏夹(但是如果有的话,您希望它们返回),那么您应该使用LEFT JOIN。希望这会有所帮助。