2

我是世界上最新加入 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),该表只有一个公共字段cnumwith comment (c),而没有一个 with 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");

它不起作用。我猜(从我读过的内容来看)这是因为我实际上是在请求另一个 join tocomment_category (cc)而不是 to 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

我的错。对不起,所有。

4

1 回答 1

1

很高兴你自己解决了这个问题。既然您说您是 JOIN 新手,我确实想补充一点,每当您将 2 个以上的表连接在一起时,考虑使用 INNER JOIN 是个好主意。不同之处在于,无论您在评论中是否有匹配项,LEFT JOIN 都将返回 LEFT 上的行(在本例中为 comment_category)。INNER JOIN 不会从 comment_category 返回行,除非它在评论中也有匹配项。

在这种情况下这很重要的原因是,为了让您的收藏夹上的 JOIN 返回除 NULL 之外的任何内容,您的查询首先需要匹配评论中来自 comment_category 的行。如果您在 comment_category 和 comment 上使用 INNER JOIN,则故障排除将不那么含糊。此外,使用 INNER JOIN 将消除结果中的 NULL 值(即 JOIN 不匹配导致的 NULL)。

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

于 2012-04-09T14:58:20.450 回答