首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL使用join连接表

问MySQL使用join连接表
EN

Stack Overflow用户
提问于 2013-01-31 02:21:17
回答 3查看 235关注 0票数 2

我已经为这个问题绞尽脑汁了一整天,我就是做不出来。这是我第一次尝试使用SQL连接,虽然我们确实学到了一些基础知识,但我更倾向于更深入地研究更高级的东西。

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

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

代码语言:javascript
复制
$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));

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

感谢您的阅读!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-31 02:23:34

要连接表,您需要映射外键。假设您的groups表有一个groupID字段,您可以这样连接它们:

代码语言:javascript
复制
SELECT `topicName`, `topicDate`, `groupName`, `groupID`
FROM `f_topics`
LEFT JOIN `f_groups`
ON `f_topics`.`groupID` = `f_groups`.`groupID`
WHERE`f_topics`.`topicID`='$tid';
票数 2
EN

Stack Overflow用户

发布于 2013-01-31 02:25:10

基于这一假设,您可以执行内部联接或左联接。INNER要求在两个表中都有一个条目,而LEFT要求只有f_topics中的数据。

代码语言:javascript
复制
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'
票数 0
EN

Stack Overflow用户

发布于 2013-01-31 03:06:26

我建议您避免使用NATURAL JOIN。

主要是因为在被引用表中添加与另一个被引用表中的列名相匹配的新列可能会破坏正在工作的查询。

其次,对于SQL的任何读者(审查者)来说,在没有仔细检查两个表的情况下,哪些列与哪些列相匹配并不清楚。(而且,如果有人添加了破坏查询的列,则在添加该列之前,更难确定连接条件是什么。

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

使用表名或较短的表别名来限定所有列引用也是一种好的做法。

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

如果没有这两个表的定义,我将不得不做一些假设,我“猜测”这两个表中都有一个groupID列,这是唯一一个名称相同的列。但是您指定f_topics中的topicBase列与f_groups中的groupID匹配。(自然连接不会给你带来这样的结果。)

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

代码语言:javascript
复制
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关键字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14611002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档