【问题标题】:MySql displaying results in same order no matter "array-order"无论“数组顺序”如何,MySql 都以相同的顺序显示结果
【发布时间】:2010-03-09 17:16:58
【问题描述】:

我正在使用“solr”搜索引擎来查询符合给定条件的分类的索引。结果是分类的 ID:numbers,然后我用它来查找 MySql 数据库中具有这些 ID:s 的所有匹配项。 返回的 ID:s 被放入一个数组中。

正如您在下面看到的,数组已内爆。 然后我使用“IN”查找所有匹配项。

$solr_id_arr_imploded = implode("', '", $solr_id_arr);
$query = "SELECT mt.*, $sql_tbl.* FROM classified mt LEFT JOIN $sql_tbl ON 
$sql_tbl.classified_id = mt.classified_id WHERE mt.ad_id IN ('$solr_id_arr_imploded')";

$sql_tbl 是用户选择的类别,在这种情况下可以说是“汽车”。

我的问题是这样的:
我有 ID:numbers 顺序(在数组内),但 MySql 并不“关心”这个顺序。无论数组的顺序如何,MySql 都会首先显示最旧的项。

所以这里是一个相同的查询,显示有两个不同的“数组方向”:

SELECT mt.*, fordon.* FROM classified mt LEFT JOIN fordon ON fordon.classified_id = mt.classified_id WHERE mt.ad_id IN ('Bmw_520i_Svensksald_784332731', 'Bmw_M3_Svensksald_755599519', 'Bmw_M3_E46_Full-utrustad_338210082')

SELECT mt.*, fordon.* FROM classified mt LEFT JOIN fordon ON fordon.classified_id = mt.classified_id WHERE mt.ad_id IN ('Bmw_M3_E46_Full-utrustad_338210082', 'Bmw_M3_Svensksald_755599519', 'Bmw_520i_Svensksald_784332731')

正如您所见,ID:s 在上面的第二个查询中被颠倒了......但无论如何它们仍然以相同的顺序显示。为什么?

我应该使用其他方法从数组中查找所有具有 ID:s 的 MySql 匹配项吗?

想法?

谢谢

【问题讨论】:

    标签: php sql mysql database arrays


    【解决方案1】:

    应该这样做:

    SELECT mt.*, $sql_tbl.* FROM classified mt 
    LEFT JOIN $sql_tbl  
    ON $sql_tbl.classified_id = mt.classified_id 
    WHERE mt.ad_id IN ('$solr_id_arr_imploded') 
    ORDER BY FIELD(mt.ad_id,'$solr_id_arr_imploded')
    

    Order By Field in Sorting Rows

    【讨论】:

      【解决方案2】:

      MySQL 将按照它“想要”的顺序返回数据(我想这将是聚集索引的顺序,或者类似的东西),如果您没有指定 order by 子句。

      如果你想改变 MySQL 返回结果的顺序,你必须添加一个order by 子句。


      如果这在您的情况下是不可能的,您将不得不重新排序 PHP 代码中的元素——例如,您应该遍历 Solr 返回的 id 列表,而不是显示 MySQL 返回的结果,并且从那里开始显示结果。

      基本上,您将首先执行 MySQL 查询以获取结果:

      SELECT mt.*, fordon.* 
      FROM classified mt 
          LEFT JOIN fordon ON fordon.classified_id = mt.classified_id WHERE mt.ad_id IN (
              'Bmw_520i_Svensksald_784332731', 'Bmw_M3_Svensksald_755599519', 
              'Bmw_M3_E46_Full-utrustad_338210082'
          )
      

      然后您可以在 PHP 中遍历这些结果,将它们存储在关联数组中(伪代码)

      $hash = array();
      foreach ($db_results as $elem) {
          $hash[$elem->ad_id] = $elem;
      }
      

      $hash 将包含由 id 索引的数据。

      然后,您将显示数据,使用 Solr 返回的内容作为循环的起点(伪代码)

      foreach ($solr_results as $id_solr) {
          echo $hash[$id_solr]->some_field . '<br />';
      }
      


      有了这个,您将:

      • 按 Solr 返回的顺序显示结果
      • 不要在数据库端进行额外的(并且可能代价高昂)排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-20
        • 2020-03-31
        • 1970-01-01
        • 1970-01-01
        • 2016-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多