我正在使用“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?
想法?
由于
答案 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')
答案 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 />';
}
有了这个,你将: