2009-12-14 95 views
1

所以,基本上,我有一个名为'主题'的MySQL表格,另一个名为'回复',例如。在表格“主题”中,有一个名为“relforum”的字段,它将此主题与论坛部分相关联。在表格'回复'中,有一个名为'reltopic'的字段,它将回复与主题联系起来。两个表都有一个id字段,即auto_increment主键。这个查询可以在没有循环的情况下完成吗?

现在,我想选择某个论坛的所有回复。由于人的答复“没有“relforum”字段,我的办法是:

  • 选择带有“relforum”等于某些论坛和循环通过他们的所有主题
  • 而在循环中,从所有回复正在处理的主题
  • 将所有fetch_array结果合并到一个多维数组中,然后遍历它们。

这是这样的:

$query = mysql_query("SELECT * FROM `topics` WHERE `relforum` = '1'"); 
while($array = mysql_fetch_array($query)) { 
    $temp = mysql_query("SELECT * FROM `replies` WHERE `reltopic` = {$array['id']}"); 
    $results[] = mysql_fetch_array($temp); 
} 

有没有一种方法来合并所有为较少的疑问?因为这个过程基本上会在该论坛的每个主题上运行一个查询加一个查询。这将是太多了:P

将relforum字段添加到答复表是一个解决方案(我仍在设计数据库部分,所以它不是一个问题添加它),但我想看看是否有一个解。我真的不善于SQL的东西,我只知道基本的SELECT/INSERT/UPDATE,而且我通常使用PHPMyAdmin生成最后两个,所以...我想我需要一些帮助。

感谢您的阅读!

+0

我这样做是同一类型的错误,当我许多年前编写了一个论坛,论坛社区长大了很多,我踢出了多个托管提供商使用太多资源:) – 2009-12-14 21:06:36

回答

2

你基本上需要两个表的连接。

SELECT * FROM `replies`, `topics` WHERE `replies`.`reltopic` = `topics`.`id` AND `topics`.`relforum` = '1'; 
+0

明白了,谢谢:) – 2009-12-14 20:43:45

+0

这只是要选择设置了答复的主题集,尽管这是OP所要求的。只要不发现任何在结果集中没有回复的主题,就不会感到困惑。如果你只想回复数据,你想要:'SELECT reply。* FROM ...' – 2009-12-14 20:56:44

2
SELECT r.* FROM replies r, topics t 
WHERE t.relforum = 1 AND r.reltopic = t.id 

摆脱反引号的。他们是非标准和杂乱的代码

+0

嗯,我已经习惯了反引号,我记得一个选择查询失败,因为我用了一个保留字(I考虑)指定要选择什么时,所以我开始使用它们:P – 2009-12-14 20:45:45

+0

这是一个弱的理由,并且对反引号的依赖可能会给某些工具带来麻烦。但是mysql是歪斜的(来自标准)和*不一致的*(在不同的操作系统上有不同的行为),所以你总是搞砸了...... – 2009-12-14 20:56:50

4

你需要学习使用连接。下面的链接是针对SQL服务器的,但mySQl的理论与基本连接基本相同。请不要使用基于逗号的连接,因为它们已经过时了18年,并且是一个很好的例子。学习使用ANSII标准连接。

http://www.tek-tips.com/faqs.cfm?fid=4785

在访问数据库,你几乎从来不希望使用任何循环。当被要求操作数据集而不是单独行时,数据库被设计为执行得最好。所以你需要停止考虑循环,并开始考虑你需要的一组数据。

+0

+1循环和游标几乎总是SQL的错误方法。 – 2009-12-14 20:51:47

+0

另一个很好的参考:http://www.codinghorror.com/blog/archives/000976.html – 2009-12-14 20:51:56

+0

谢谢大家,我一定会看看。 – 2009-12-15 07:51:25

2

是的,您应该在这里使用join。但是,您需要更加小心地处理结果集。

连接是关系数据库模式中的基本查询。将它们添加到您的知识阿森纳:)

3
SELECT 
     r.* 
FROM 
     replies r 
INNER JOIN 
     topics t 
ON 
     r.reltopic = t.id 
WHERE 
     t.relforum = 1;