可以在没有循环的情况下完成此查询吗?

时间:2009-12-14 20:38:27

标签: php mysql

因此,基本上,我有一个名为'topics'的MySQL表,另一个名为'replies'的表,例如。在表'主题'中,有一个名为'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生成最后两个,所以...我想我需要一些帮助。

感谢阅读!

5 个答案:

答案 0 :(得分:4)

您需要学习使用连接。下面的链接适用于SQL服务器,但mySQl的理论基本连接几乎相同。请不要使用基于逗号的连接,因为它们已经过时了18年,并且是一个常规实践。学习使用ANSII标准连接。

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

在访问数据库时,您几乎不想使用任何循环。数据库被设计为在被要求操作数据集而不是单个行时表现最佳。因此,您需要停止考虑循环并开始考虑所需的数据集。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

摆脱反引号。它们是非标准的,混乱的代码

答案 4 :(得分:2)

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

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