Php 如何在X上左接A到B,然后在Y上左接B到C

Php 如何在X上左接A到B,然后在Y上左接B到C,php,mysql,sql,Php,Mysql,Sql,我是世界上最新皈依左撇子的人。以下各项运作良好: $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

我是世界上最新皈依左撇子的人。以下各项运作良好:

$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");
不过,我现在想做的是引用另一个表
favorite(f)
,它只有一个公共字段
cnum
comment(c)
,而没有一个字段是
comment\u 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\u category(cc)
,而不是
comment(c)

简言之:我如何从A中选择,左连接到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)
。。。我就到此为止-它崩溃了,因为
favorite
表中没有收藏夹字段


我的错误。对不起,各位。

很高兴你自己解决了这个问题。既然你说你是新加入的,我想补充的是,当你加入2多个表在一起,这是一个好主意,考虑使用内部连接。不同之处在于,左连接将返回左侧的行(在本例中为comment_类别),而不管comment中是否有匹配项。内部联接不会从comment_类别返回行,除非它在comment中也有匹配项

在这种情况下,这一点很重要,因为为了让您在收藏夹上的JOIN返回除null以外的任何内容,您的查询首先需要匹配comment中comment_category中的一行。如果在注释和注释类别上使用内部联接,则故障排除将不那么模棱两可。此外,使用内部联接将从结果中消除空值(即,联接不匹配导致的空值)


左联接与内联接的使用也取决于您的业务需求。例如,如果comment_类别中的所有行都必须在comment中匹配,那么您应该使用内部联接。但是,如果您查询的评论不一定要有收藏夹(但如果有收藏夹,您希望返回它们),那么您应该使用左连接。希望这能有所帮助。

您是否正在寻找类似以下内容:从左连接中选择blah B.B=A.A左连接C.C=B.something?您的SQL看起来有效。你犯了什么错误?你说“它不工作”是什么意思?错误?没有返回行?抱歉,全部返回。没有返回行。我会更新这个问题。@Nick:你在php代码中做错了什么。如果QueryA返回行,QueryB也必须返回。(来自@Dmitry Smirnov):请提供表的结构和确切的错误消息好吗?若并没有错误信息,那个么就提出一个更精确的问题:你们期望得到什么,你们得到了什么?谢谢。我会继续玩的。