MySQL加入表加入表

时间:2013-01-30 18:21:17

标签: php mysql sql join web

我整天都在摸着这个问题而且我很简单就是无法解决这个问题。这是我第一次尝试尝试使用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));

很抱歉,如果这没有多大意义,如果我的整个逻辑完全错误,你是否可以建议另一种方法?

感谢阅读!

3 个答案:

答案 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关键字。