【问题标题】:php sorting sql recordsphp对sql记录进行排序
【发布时间】:2011-09-08 23:25:56
【问题描述】:

我正在遍历表中的记录,并且在每个循环中它都会打开另一个表以从中提取数据。我需要按第二个表中的字段对主循环($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

【问题讨论】:

  • 我们需要更多信息,特别是重新审视表格以及您想要完成的具体内容。

标签: php mysql sql loops


【解决方案1】:

循环遍历结果集并为每一行执行第二个查询是不好的做法,会导致数据库不必要的负载。
看来您需要INNER JOIN:

    SELECT t1.*
      FROM table1 t1
INNER JOIN table2 t2 ON t2.id = t1.data
  ORDER BY t2.field

这样,您可以通过一个单个查询获取所有数据。


编辑:
一般来说,您应该尽量避免返回所有列 (SELECT *),只选择您真正需要的列:

SELECT t1.id, t2.field1, t1.field2, ...

这不仅会减少数据库的负载(选择和通过网络传输的数据更少),而且还有助于消除双列名,因为当您想要显示双列名时会出现问题(如你自己发现的)。

你可以做两件事来避免这个问题:

  1. 如果两个表都有相同名称和相同内容的列(例如,如果这些列用于连接表),只需选择其中一个(不管是哪一个,因为它们是相同的)。

  2. 如果两个表的列具有相同的名称和不同的内容,并且您需要它们,最简单的方法是为其中一个指定别名:

    SELECT t1.id, t2.id AS AnotherId, ...
    

    这将导致第二列被命名为“AnotherId”,因此您可以使用$rs[AnotherId] 获取它。
    老实说,我不是 PHP 专家,所以我不知道 PHP 是否也理解 $rs[table.field],但是当查询返回具有相同名称的两列时,有足够多的数据访问技术会出现问题......所以别名重复列可以永远不会错。

【讨论】:

  • 谢谢。以及如何调用 echo 语句的字段,我通常使用 $rs[field],它是一样的还是必须做 $rs[table.field]?
  • 列名在结果集中返回时不会自动更改,因此您应该能够继续按名称引用它们。除非您的应用程序实际上需要结果集中的每一列,否则通过 SELECT * 获取每一列效率低下,因此您最好从 t1 和 t2 中准确指定您想要的列,这也将使您能够重命名/重新标记任何两个表中具有相同名称的列。
  • t1 只是表名的别名,与我刚刚编辑到答案中的列的别名完全相同。当你必须多次写表名时(比如当你连接多个表时),写t1.field而不是LongTableName.field更容易。
  • 非常感谢,您帮了大忙
  • @user880356:为了表达你的感激之情,你也可以投票赞成我的回答 ;-)(我在你的个人资料中看到你从来没有投票过)
猜你喜欢
  • 2021-12-12
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多