MySql отображает результаты в том же порядке, независимо от «порядка массива» - PullRequest
1 голос
/ 09 марта 2010

Я использую поисковую систему «solr» для запроса индекса объявлений, соответствующих заданным критериям. Результатом является ID: номера объявлений, которые я затем использую, чтобы найти все совпадения в базе данных MySql с этими 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: числа в порядке (внутри массива), но 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')

Как вы можете видеть, идентификаторы поменялись местами во втором запросе выше ... Но они все равно отображаются в том же порядке. Почему?

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

Идеи

Спасибо

Ответы [ 2 ]

2 голосов
/ 09 марта 2010

Это должно сделать это:

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')

См. Порядок по полю в строках сортировки .

0 голосов
/ 09 марта 2010

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

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


Еслив вашем случае это невозможно, вам придется переупорядочить элементы из кода PHP - например, вместо отображения результатов из того, что возвращает MySQL, вы должны перебрать список идентификаторов, возвращаемых 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 будет содержать данные, проиндексированные по идентификатору.

И тогда вы отобразитеданные, используя то, что Solr вернул в качестве отправной точки для цикла (псевдонимdo-code) :

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


При этом вы:

  • отобразите результаты в порядке, возвращенном Solr
  • не выполнять дополнительную (и, возможно, дорогостоящую) сортировку на стороне базы данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...