2012-04-05 5 views
2

Ich habe ein Array mit einigen IDs, die ich verwenden, um eine Zeile aus der Datenbank zu wählen.MySql-Abfrage zurückgegeben Array nicht wie Eingabe-Array bestellt

Die Auswahl geht gut, aber ich nicht meine Ergebnisse zurück in der geordneten gegebenen Array erhalten

Eingefügt Array (var_dump)

0 => string '40201' (length=5) 
    1 => string '44089' (length=5) 
    2 => string '42106' (length=5) 
    3 => string '42740' (length=5) 
    4 => string '43812' (length=5) 
    5 => string '44331' (length=5) 
    6 => string '42109' (length=5) 
    7 => string '44147' (length=5) 
    8 => string '40464' (length=5) 
    9 => string '42108' (length=5) 

Ausgangsarray

array 
    0 => 
    array 
     'id' => string '40201' (length=5) 
    1 => 
    array 
     'id' => string '40464' (length=5) 
    2 => 
    array 
     'id' => string '42106' (length=5) 
    3 => 
    array 
     'id' => string '42108' (length=5) 
    4 => 
    array 
     'id' => string '42109' (length=5) 
    5 => 
    array 
     'id' => string '42740' (length=5) 
    6 => 
    array 
     'id' => string '43812' (length=5) 
    7 => 
    array 
     'id' => string '44089' (length=5) 
    8 => 
    array 
     'id' => string '44147' (length=5) 
    9 => 
    array 
     'id' => string '44331' (length=5) 

Meine zend query:

$select = $this->_db 
     ->select() 
    ->from(array('file' => 'filehosts'), array('id')) 
    ->where('file.id IN(?)', $array); 

    $result = $this->getAdapter()->fetchAll($select); 
    return $result 

Ich denke, es ist die Schlussfolgerung des ID-Follow-up, zuerst wird einer genommen und dann nimmt er nur den, den er zuerst findet, der im Array ist, oder? Wie kann ich das strikter machen, damit die Abfrage die Array-Reihenfolge nicht ändert?

Vielen Dank im Voraus. Nick

+0

Im nicht mit zend vertraut, aber es scheint mir, wie die SELECT-Anweisung wird eine ORDER BY – OneThreeSeven

Antwort

1

Mysql FIELD-Funktion wird funktionieren.

$select = $this->_db->select() 
->from(array('file' => 'filehosts'), array('id')) 
->where('file.id IN(?)', $array) 
->order(new Zend_Db_Expr('FIELD(file.id, ' . implode(',', $array) . ')')); 

$result = $this->getAdapter()->fetchAll($select); 
return $result 
+0

Genau das, was ich brauche, vielen Dank !! :-) – directory

0

Wenn Sie eine Abfrage tun, können Sie die Ergebnisse mit ORDER BY

SELECT * FROM `file` WHERE `file`.`id` IN $array ORDER BY `file`.`id` ASC 

bestellen bin ich mit zend nicht vertraut, aber ich denke, ->order('file.id') die Arbeit machen konnte.

Siehe Zend documentation

+0

fehlt weiß, dass ich den Auftrag, aber wie Sie sehen können, habe ich eine Reihe, die bereits bestellt ist (kommt Form sphinxSearch) also möchte ich meine Ergebnisse wieder in einem Array haben, wie ich sie in – directory

+0

bin Ich bin mir ziemlich sicher, dass der 'IN' Teil der Abfrage die Anordnung Ihres Arrays ingoresziert. Sie können Ihre Ergebnisse anschließend mit 'ksort()' oder einer der anderen Sortierungsfunktionen von php sortieren. –

+0

Ja, ich bin mir sicher, jetzt ignoriert es die Reihenfolge meines Arrays und ich denke, er erstellt seinen eigenen effizientesten Weg, das gegebene Array zu durchsuchen. ksort() ist keine Option, da der Schlüssel immer noch derselbe ist, so dass der Wert nicht in der richtigen Reihenfolge ist. – directory

0

Überlegen Sie, was die zugrunde liegenden Code tun würde.

Es geht durch sie in der Datei, die fast sicher durch ID und die Prüfung bestellt wird, wenn es in Ihrem Array ist, das in einer vollständig anderen Reihenfolge ist.

Die Reihenfolge der Elemente in $ Array ist für die Anforderung völlig irrelevant, alles, was zählt, ist vorhanden oder nicht.

+0

Warum ist es irrelevant? Ich bekomme meine Array-Ergebnisse von der SphinxSearch in der guten Reihenfolge, mit diesem Array kann ich 1 Abfrage für eine Seite machen, um die 'Suchergebnisse' zu bekommen. Dies ist, was ich versuche, jetzt zu erreichen, nur einen Schritt von der Ziellinie entfernt die Ergebnisse (ich drucke jetzt nur ID, um es einfacher zu sehen). – directory

+0

Es ist irrelevant für SQL's in Funktion. Um zu bekommen, was Sie wollen, müssten Sie die Operation umkehren, indem Sie aus dem Array auswählen, in dem Sie aus der Tabelle auswählen, was ein 'sehr schwierig' wäre. –