无论“数组顺序”,MySql都以相同的顺序显示结果

时间:2010-03-09 17:16:58

标签: php sql mysql database arrays

我正在使用“solr”搜索引擎来查询与给定条件匹配的分类的索引。结果是ID:分类的数量,然后我用它来查找MySql数据库中所有匹配的ID:s。 返回的ID:将放入数组中。

正如您在下面看到的那样,阵列已经内爆。 然后我使用“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:数字在一个顺序(在数组内),但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?

想法?

由于

2 个答案:

答案 0 :(得分:2)

这应该这样做:

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

答案 1 :(得分:0)

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
  • 返回的顺序显示结果
  • 不在数据库端执行额外的(并且可能代价高昂)排序。