我不能完全理解你在问什么,也不能理解这些表格是如何相互关联的。我假设表 B 是用户数据库表,表 A 就像一个主题数据库表,我还假设表 C 是对表 A 的注释。这种关系正确吗?(随着我对到底发生了什么越来越清楚,我将编辑这篇文章)。
编辑1:这是你在说什么?正如我已经评论过的,我不明白第三张表用于这样的事情吗?
$sql = "SELECT * FROM table_a WHERE Topic=10";
$ans = mysql_query($sql) or die(mysql_error())
while($result = mysql_fetch_assoc($ans)){
}
mysql_free_result($ans)
编辑 2:为了加快这种交流,我将简要介绍一下我所知道的关于连接表的所有内容。
有几种方法可以从多个表中选择数据,您可以使用最适合您的目的的方法。
假设我们有以下表格设置:
Users : user_id, username, user_email
Topics: topic_id, user_id, topic_title, topic_text
Posts: post_id, topic_id, user_id, post_text
这是我经常处理的 PhpBB 的设置。第一个表很简单,它是用户信息表,存储有关用户的所有信息。第二个是发布的主题列表,仅提供标题的基本信息以及发布者。第三个是重要的,是除原始主题之外的所有帖子。例如,标题为“谁将在战斗中获胜……”的主题,文本为“超人或蝙蝠侠”,在 topic_title 中仅包含“谁将在战斗中获胜……”,在 topic_text 中包含“超人或蝙蝠侠” ,而对“蝙蝠侠”主题的第一条评论将在帖子表中。
现在,假设我在我的论坛板上,所以我想查看所有的主题来决定我应该在哪里发帖。这是通过
$sql = "SELECT t.*,u.username FROM topics t, users u WHERE u.user_id=t.user_id";
$ans = mysql_query($sql);
while($result = mysql_fetch_assoc($ans)){
echo $result['topic_title'].' | '.$result['username'].'<br />';
}
这是连接表的最基本版本。它说我要从主题中选择所有内容,并从用户表中的 user_id 列与主题表中的 user_id 列相同的用户中选择用户名。还有另一种写法,但现在让我们关注基础知识。
这会给你这样的结果
Who would win in a fight... | Bob123
If you could go anywhere in the world | Jose567
Where is the most awkward place you've ever sneezed | Sneezerella
我没有放入代码来使标题可点击,但假设您了解 HTML,那应该不难。所以现在假设我们点击了这些链接之一,它看起来应该类似于
<a href="viewtopic.php?t=1">Who would win in a fight...</a>
所以,我们现在在 viewtopic.php 上,被传递了一个参数,t。然后我们将采取 t 并像这样进行:
//Assuming connections somewhere up here
$sql = "SELECT t.*,u.username FROM topics t, users u WHERE u.user_id=t.topic_id AND t.topic_id=".$_GET['t']; //This should look familiar, also remember to sanitize your MySQL data, don't just tack it on straight from the $_GET variable like I did. I'm typing this while dealing with my 8 month old
$ans = mysql_query($sql) or die(mysql_error());
$first_post = mysql_fetch_assoc($ans);
echo first_post['topic_title'].'-'.$first_post['username'].'<br /> '.$first_post['topic_text'].' <hr />';
//Outputs something like "Who would win in a fight... - Bob123 <br /> Superman or Batman?
mysql_free_result($ans);
//Gotten the first post and everything else, now to see the comments.
$sql = "SELECT p.*,u.username FROM posts p, users u WHERE u.user_id=p.user_id AND p.topic_id = ".$_GET['t'];
$ans = mysql_query($sql) or die(mysql_error())
while($result = mysql_fetch_assoc($ans)){
echo $result['username'].' <br />'.$result['post_text'].'<hr />';
}
//This will output something like Sneezerella <br /> Batman <hr /> Bob123 <br /> Superman <hr /> ....[etc]....
mysql_free_result($ans)
有时您也必须使用 LEFT JOIN、RIGHT JOIN 和/或 INNER JOIN 语句。据我所知,这里有区别
- 内连接 - 这是编写 SELECT t 的另一种方式。,u.username FROM topic t, users u WHERE t.user_id = u.user_id。这里的语法是 SELECT t。,u.usernmae FROM topic t INNER JOIN users u ON u.user_id = t.topic_id。此方法在添加的表中查找 1 行,在本例中为“用户”。如果它没有找到对应的行,它将返回一个空值。IE 如果我在主题帖子上有 user_id = 1,而 user_id 实际上是 2,则不会返回任何内容。
- 左连接 - 将右表中的数据添加到从左侧选择的数据上。W3Schools 上的这篇文章对其进行了快速分解。基本上它总是从原始表中选择,并且会为任何其他结果返回 NULL。语法与 INNER JOIN 相同,只需将 INNER 替换为 LEFT。所以我们会得到SELECT t.* FROM topics t LEFT JOIN users u ON u.user_id=t.user_id。在上面的示例中,我说过如果两个表中的 user_id 不匹配,则不会返回任何内容。LEFT JOIN 并非如此。相反,如果相同的情况是真的,您将收到结果,就好像您刚刚从主题表中选择一样,以及一个名为 username 的列的结果为 NULL。
- Right Join - 与 LEFT JOIN 相同的功能。我不能说我曾经使用过这个,因为我更喜欢使用 LEFT JOIN。基本上,RIGHT JOIN 查询看起来像 SELECT t.*, u.username FROM topics t RIGHT JOIN users u ON u.user_id=t.user_id。这将为主题中的所有列提供具有 NULL 的所有用户名。这也许可以通过这篇关于 W3Schools 的文章得到更好的解释。