2012-03-27 4 views
0

Der Titel könnte mein Problem nicht vollständig erklären, aber ich war mir nicht sicher, wie in einem Titel, so werde ich mehr hier erklären.MySQL/PHP-Reihenfolge nach mehreren Spalten mit einem an der Spitze

Ich habe eine Tabelle, die verschiedene Informationen über Bands/Acts enthält und ich habe eine Browse-Seite, die alle Acts in einem bestimmten Bereich usw. zeigt. Jeder Act kann sagen, ob er Getränke/Essen/Unterkunft/Extra/Reisen möchte bezahlt werden. Auf der Durchsuchen-Seite habe ich auch eine Sortierfunktion, mit der ich die Ergebnisse sortieren kann, nach denen die Acts was bezahlt haben wollen.

Es gibt fünf Kontrollkästchen für jede der Optionen, aber wenn ich nur die Reise zum Beispiel überprüfe, sind Taten, die Reisen sowie die anderen angekreuzt sind oben, wenn ich will, dass nur die Reise für oben bezahlt werden soll .

Derzeit beginnt die Sortierfunktion mit der ursprünglichen Abfrage von beim Surfen:

SELECT * FROM acts 

Und dann fügt die Sortierfunktion die ORDER BY-Anweisung je nachdem, was geprüft wurde:

SELECT * FROM acts ORDER BY travel DESC 

Oder wenn mehr als eins wurde ausgewählt:

SELECT * FROM acts ORDER BY travel DESC, food DESC 

Aber wie gesagt das geht nicht oder der Liste richtig (also für die zweite Sortierung nach Abfrage würde ich einen Akt wünschen, der nur Reise und Essen an der Spitze wollte).

Ich habe auch versucht, in ORDER BY ASC für die Optionen hinzuzufügen, die nicht ausgewählt wurden, aber das hat nicht geholfen.

Auch die Spalten in der Datenbank enthalten entweder "ja" oder "nein", weshalb ich DESC verwendet habe, wenn ich möchte, dass sie oben sind. Ich habe die Datenbank nicht erstellt und sie kann auch nicht geändert werden.

Danke für jede Hilfe.

EDIT: Sie können sehen, was ich hier meine: http://www.acthook.com/browse.php Wenn Sie die Durchsuchen-Felder leer und klicken Sie auf Durchsuchen, um alle Ergebnisse zu erhalten, dann tick Reisen und klicken Sie auf sortieren, gibt es einen Akt nur Reise Teilweise auf der ersten Seite .

+0

diese Abfrage ziemlich ok mir scheint ... es sollte man zurückgehen ursprünglich erwartet –

+0

es funktioniert aber nicht, auch wenn ich es über phpMyAdmin probiere, habe ich getestet, nur nach Reise sortiert, aber die Handlung mit nur Reise überprüft ist in der Nähe der unteren statt der oberen –

Antwort

0

Oh ich sehe, danke für das Beispiel, es war nicht so klar, ohne:) Dann sollten Sie etwas davon haben:

SELECT * FROM acts ORDER BY travel DESC, food ASC, accomodation ASC, drink ASC, extra_fee ASC; 

Und wenn der Benutzer klickt auf Nahrung zu:

SELECT * FROM acts ORDER BY travel DESC, food ASC, accomodation ASC, drink ASC, extra_fee ASC; 

Oder wenn er nur auf Nahrung klickt:

SELECT * FROM acts ORDER BY food DESC, travel ASC, accomodation ASC, drink ASC, extra_fee ASC; 

Wie man hier sehen kann, wurde die Reihenfolge der Felder in der Reihenfolge Klausel geändert. Sie müssen darauf auch achten.

Um die Abfrage zu erstellen, können Sie etwas tun können:

$allowedOrderBy = array('travel','food','dring','extra_fee');//etc 
$foundOrderBy = array(); 
foreach ($_POST as $orderBy) { 
    if (in_array($orderBy, $allowedOrderBy)) { 
     $foundOrderBy[] = $orderBy; 
    } 
} 
$notFoundOrderBy = array_diff($allowedOrderBy, $foundOrderBy); 
$orderByStr = implode(' DESC,', $foundOrderBy).' DESC, '; 
$orderByStr.= implode(' ASC,', $notFoundOrderBy). 'ASC'; 
+0

Prost, ich denke, das macht den Trick! Irgendeine Idee von einer einfachen Möglichkeit, die Abfrage zu ändern, ohne IFs für alle verschiedenen Kombinationen haben zu müssen? –

+0

Ja. Ich habe angenommen, dass die Werte in den Kontrollkästchen die Namen der Felder enthalten. Ich bin mir nicht sicher, ob das stimmt oder nicht. – haltabush

+0

wow vielen dank! Das hätte ich nie bekommen! –

0

bin mir nicht sicher, ob es die richtige Idee ist (Problem ist in einer Datenbankstruktur), aber so etwas wie dies versucht>

Check reisen nur: SELECT * FROM table WHERE Reise = yes und Lebensmittel = no und ..= no UNION SELECT * FROM table

EDIT: oder vielleicht so etwas wie SELECT * FROM um durch Reisen, Essen DESC

Verwandte Themen