2010-03-09 1 views
1

Я использую поисковую систему «solr» для запроса индекса для объявлений, соответствующих заданным критериям. Результатом являются ID: номера объявлений, которые я затем использую, чтобы найти все совпадения в базе данных MySql с этими идентификаторами: s. Идентификатор: возвращенные элементы помещаются в массив.MySql отображение результатов в том же порядке, независимо от того, «массив-порядок»

Как вы можете видеть ниже, массив взорван. Затем я использую «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 doens't «заботу» об этом заказе. 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 меняются во втором запросе выше ... Но они все равно отображаются в том же порядке в любом случае. Зачем?

Должен ли я использовать какой-либо другой способ найти все совпадения в MySql с ID: s из массива?

Идеи?

Благодаря

ответ

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.

0

MySQL будет возвращать данные в том порядке, как «хочет» (я предполагаю, что это будет порядок кластерного индекса, или что-то в этом роде), если вы не укажете order by положение.

Если вы хотите изменить порядок, в котором MySQL возвращает результаты, вам нужно добавить пункт order by.


Если это невозможно в вашем случае, вам придется переупорядочить элементы из кода PHP - например, вместо того, чтобы отображать результаты от того, что возвращает MySQL, вы должны перебирать список ids, возвращаемые Solr, и отображать результаты, начиная с этого момента.

В принципе, вы будете первым выполнить запрос 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
  • не делать additionnal (и possibily дорого) сортировать по базе данных.
Смежные вопросы