MySql olursa olsun aynı sırayla "dizi sipariş" sonuçları görüntüleniyor

2 Cevap php

I am using "solr" search engine to query an index for classifieds that match a given criteria. The results are the ID:numbers of the classifieds, which I then use to find all matches in a MySql database with those ID:s. The ID:s returned are put into an array.

As you can see below the array is imploded. Then I use the "IN" to find all matches.

$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 kullanıcı tarafından seçilen kategori, bu durumda "araba" olduğunu söylüyorlar sağlar.

My problem is this:
I have the ID:numbers in an order (inside the array), but MySql doens't "care" about this order. MySql displays the oldest item first no matter what order the array is in.

Yani burada iki farklı "dizi-yön" ile gösterilen bir aynı sorgu:

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

Eğer kimliğini görebileceğiniz gibi: s Yukarıdaki ikinci sorguda iptal edilir ... Ama yine de her durumda aynı sırayla görüntülenir. Neden?

S bir dizi: Ben tüm MySQL bulma diğer bazı yöntem ID ile eşleşen kullanmalı mıyım?

Fikirler?

Teşekkürler

2 Cevap

Bu yapmak gerekir:

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

Bkz Order By Field in Sorting Rows.

Bir order by yan tümce belirtin yoksa MySQL, o "wants" (I suppose it'll be the order of the clustered index, or something like that) sırayla verileri döndürecektir.

MySQL sonuçlarını döndürür sırasını değiştirmek istiyorsanız, bir order by tümce eklemek gerekir.


If that's not possible in your case, you'll have to re-order the elements from the PHP code -- for instance, instead of displaying the results from what MySQL returns, you should iterate over the list of ids returned by Solr, and display the results starting from there.

Temelde, önce sonuç almak için MySQL sorgu yürütmek gerekir:

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

Sonra bir ilişkisel dizi içinde saklayarak, PHP, bu sonuçlar üzerinde döngü can (pseudo-code):

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

$ Hash id endeksli verileri içerecektir.

Ve, o zaman Solr döngü için bir başlangıç ​​noktası olarak döndü ne kullanarak, verileri görüntülemek (pseudo-code) olacak:

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


With this, you will :

  • Solr tarafından döndürülen sırayla sonuçlarını görüntülemek
  • Veritabanı tarafında bir additionnal (and possibily costly) sıralama yapmak değil.