我已经为这个问题绞尽脑汁了一整天,我就是做不出来。这是我第一次尝试使用SQL连接,虽然我们确实学到了一些基础知识,但我更倾向于更深入地研究更高级的东西。
基本上,我在做我自己的论坛,我有两张桌子。f_topics (线程)和f_groups (论坛或类别)。f_topics中的topicBase和f_groups中的groupID之间存在关系,这表明每个主题属于哪个组。每个主题都有一个名为topicID的唯一ID,组也有相同的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));抱歉,如果这没有太多意义,如果我的整个逻辑是完全错误的,如果是这样,你能建议一个替代方法吗?
感谢您的阅读!
发布于 2013-01-31 02:23:34
要连接表,您需要映射外键。假设您的groups表有一个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-31 02:25:10
基于这一假设,您可以执行内部联接或左联接。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-31 03:06:26
我建议您避免使用NATURAL JOIN。
主要是因为在被引用表中添加与另一个被引用表中的列名相匹配的新列可能会破坏正在工作的查询。
其次,对于SQL的任何读者(审查者)来说,在没有仔细检查两个表的情况下,哪些列与哪些列相匹配并不清楚。(而且,如果有人添加了破坏查询的列,则在添加该列之前,更难确定连接条件是什么。
相反,我建议您在ON子句的谓词中指定列名。
使用表名或较短的表别名来限定所有列引用也是一种好的做法。
对于更简单的语句,我同意这看起来可能是不必要的开销。但是,一旦语句变得更加复杂,这种模式将极大地提高语句的可读性。
如果没有这两个表的定义,我将不得不做一些假设,我“猜测”这两个表中都有一个groupID列,这是唯一一个名称相同的列。但是您指定f_topics中的topicBase列与f_groups中的groupID匹配。(自然连接不会给你带来这样的结果。)
我认为下面的查询将返回您想要的结果集:
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 (当没有匹配时),则可以使用外部连接来实现。
要获得这种行为,在上面的查询中,在JOIN关键字之前添加LEFT关键字。
https://stackoverflow.com/questions/14611002
复制相似问题