我正在循环遍历表中的记录,并且在每个循环中打开另一个表以从中提取数据。我需要命令主循环($rs)从第二个表的字段。
我是php和sql的初学者,所以请原谅我:p
代码示例:
$sql_result = mysql_query("SELECT * FROM table1", $db); // i want this to ORDER BY data from table2
while($rs = mysql_fetch_array($sql_result)) {
$sql_result2 = mysql_query("SELECT * FROM table2 WHERE id='$rs[data]'", $db);
$rs2 = mysql_fetch_array($sql_result2);
//get data from table 2
遍历结果集并对每一行执行第二次查询是不好的做法,会给数据库带来不必要的负载。
看起来你需要一个INNER JOIN
:
SELECT t1.*
FROM table1 t1
INNER JOIN table2 t2 ON t2.id = t1.data
ORDER BY t2.field
通过这种方式,您可以通过单个查询获得所有的数据。 编辑: 这不仅会减少数据库的负载(更少的数据选择和通过网络传输),而且还有助于消除双列名,因为当您想要显示它们时,双列名会导致问题(正如您自己发现的那样)。 你可以做两件事来避免这个问题: 如果两个表具有相同名称和相同内容的列(例如,如果这些列用于连接两个表),只需选择其中一个(不管是哪一个,因为它们是相同的) 如果两个表的列具有相同的名称和不同的内容,并且您需要这两个表,最简单的方法是给其中一个别名: 这将导致第二列被命名为"AnotherId",所以你可以用
一般来说,您应该尽量避免返回所有列(SELECT *
),而只选择真正需要的列:SELECT t1.id, t2.field1, t1.field2, ...
SELECT t1.id, t2.id AS AnotherId, ...
$rs[AnotherId]
来获取它。
老实说,我不是PHP专家,所以我不知道PHP是否也理解$rs[table.field]
,但是有足够的数据访问技术,当查询返回具有相同名称的两列时,会出现问题……所以混叠重复的列永远不会出错。