我整天都在摸着这个问题而且我很简单就是无法解决这个问题。这是我第一次尝试尝试使用SQL Joining,而我们有点教授基础知识,我更倾向于进一步学习高级内容。
基本上我正在创建自己的论坛,我有两张桌子。 f_topics(线程)和f_groups(论坛或类别)。 f_topics中的topicBase和f_groups中的groupID之间存在关系,这表明每个主题属于哪个组。每个主题都有一个名为topicID的唯一ID,对于组称为groupID。
基本上,我正在尝试将所有这些列放入单个SELECT语句中 - 主题的标题,主题发布的日期,主题所属的组的ID以及该组的名称。这就是我试图使用的内容,但即使主题在groupID 2中,该组也总是返回1:
$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));
很抱歉,如果这没有多大意义,如果我的整个逻辑完全错误,你是否可以建议另一种方法?
感谢阅读!
答案 0 :(得分: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';
答案 1 :(得分: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'
答案 2 :(得分:0)
我建议你避免使用NATURAL JOIN
。
主要是因为可以通过在引用表中添加新列来破坏工作查询,该列与另一个引用表中的列名匹配。
其次,对于SQL的任何读者(审阅者),哪些列与哪些列不匹配,而不仔细检查两个表。 (并且,如果有人添加了一个破坏了查询的列,则在添加列之前,更难以确定JOIN标准的用途。
相反,我建议您在ON子句中的谓词中指定列名。
通过表名限定所有列引用也是一种好的做法,或者最好是更短的表别名。
对于更简单的陈述,我同意这可能看起来像是不必要的开销。但是一旦语句变得更复杂,这种模式就会大大提高语句的可读性。
如果没有这两个表的定义,我将不得不做出假设,我“猜测”这两个表中都有groupID
列,这是唯一的列。命名相同。但您指定topicBase
中的f_topics
列与groupID
中的f_groups
匹配。 (并且NATURAL JOIN不会让你这么做。)
我认为此查询将返回您想要的结果集:
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
关键字。