2

我整天都在为这个问题挠头,我只是无法解决。这是我第一次尝试使用 SQL Joining,虽然我们确实学到了一些基础知识,但我更倾向于将更多内容推向高级内容。

基本上我正在制作自己的论坛,并且有两张桌子。f_topics(线程)和 f_groups(论坛或类别)。f_topics 中的 topicBase 和 f_groups 中的 groupID 之间存在关系,这表明每个主题属于哪个组。每个主题都有一个唯一的 ID,称为 topicID,组 ID 相同,称为 groupID。

基本上,我试图将所有这些列放入一个 SELECT 语句中 - 主题的标题、主题发布的日期、主题所属组的 ID 以及该组的名称。这是我试图使用的,但组总是返回为 1,即使主题在 groupID 2 中:

$query=mysqli_query($link, "

SELECT `topicName`, `topicDate`, `groupName`, `groupID`
FROM `f_topics`
NATURAL JOIN `f_groups`
WHERE `f_topics`.`topicID`='$tid';


") or die("Failed to get topic detail E: ".mysqli_error());
var_dump(mysqli_fetch_assoc($query));

对不起,如果这没有多大意义,如果我的整个逻辑完全错误,如果是这样,你能建议一种替代方法吗?

谢谢阅读!

4

3 回答 3

2

要连接表,您需要映射外键。假设您的组表有一个groupID字段,这就是您加入它们的方式:

SELECT `topicName`, `topicDate`, `groupName`, `groupID`
FROM `f_topics`
LEFT JOIN `f_groups`
ON `f_topics`.`groupID` = `f_groups`.`groupID`
WHERE`f_topics`.`topicID`='$tid';
于 2013-01-30T18:23:34.410 回答
0

因此,据我所知,f_topics 中有一个名为“topicBase”的列,它引用了 f_groups 表中的 groupID 列。

基于该假设,您可以执行 INNER JOIN 或 LEFT JOIN。INNER 要求两个表中都有一个条目,而 LEFT 要求 f_topics 中只有数据。

SELECT
    f_topics.topicName,
    f_topics.topicDate
    f_groups.groupName
    f_groups.groupID
FROM
    f_topics
INNER JOIN
    f_groups
    ON
    f_topics.topicBase = f_groups.groupID
WHERE
    f_topics.topicID = '$tid'
于 2013-01-30T18:25:10.440 回答
0

我建议你避免NATURAL JOIN

主要是因为可以通过在引用表中添加一个新列来破坏工作查询,该列与另一个引用表中的列名匹配。

其次,对于 SQL 的任何读者(审阅者)来说,哪些列与哪些列匹配并不清楚,没有仔细审查两个表。(而且,如果有人添加了一个破坏查询的列,那么在添加该列之前就更难弄清楚过去的 JOIN 标准是什么。


相反,我建议您在 ON 子句的谓词中指定列名。

通过表名或最好是较短的表别名来限定所有列引用也是一种好习惯。

对于更简单的陈述,我同意这可能看起来像不必要的开销。但是一旦语句变得更加复杂,这种模式极大地提高了语句的可读性。

如果没有这两个表的定义,我将不得不做出假设,并且我“猜测”这groupID两个表中都有一个列,这是唯一一个名称相同的列。但是您指定它在中匹配的topicBase列。(而 NATURAL JOIN 不会让你明白这一点。)f_topicsgroupIDf_groups

我认为此查询将返回您想要的结果集:

SELECT t.`topicName`
     , t.`topicDate`
     , g.`groupName`
     , g.`groupID`
  FROM `f_topics` t
  JOIN `f_groups` g
    ON g.`groupID` = t.`topicBase`
 WHERE t.`topicID`='$tid';

如果topicBase列可能为 NULL 或包含与 f_groups.GroupID 值不匹配的值,并且您希望返回该主题,并且 f_group 中的列返回为 NULL(当不匹配时),您可以获得与外部连接。

为了获得这种行为,在上面的查询中,在LEFT关键字之前添加JOIN关键字。

于 2013-01-30T19:06:25.783 回答