Datensätze mit höchster Priorität (LEAST) nach erfolgter WHERE Abfrage ausgeben

davanshi

Grünschnabel
Hallo liebe Forum Gemeinde,

ich habe folgendes Anfängerproblem und hoffe hier auf ein paar nützliche Tipps:

Ich möchte Fahrzeuge aus einer Datenbank ausgeben die mit Hilfe einer Kategorie, einem Status und einer Priorität gefiltert werden sollen...

hier einmal meine bisherige Anfrage die auch Funktioniert:

PHP:
$responseQuery = "'AR','EMS','FT','CC'";
$res = mysql_query("SELECT * FROM cd_vehicle WHERE vehicle_category IN ($responseQuery) AND vehicle_status = 'S2'");

Die responseQuery lasse ich mir von einem select feld aus einer anderen Tabelle erstellen. Der Status S2 steht für vefügbar und soll verwendet werden.

Jetzt habe ich pro Fzg Kategorie mehrere Fahrzeuge ich möchte jedoch jeweils nur eins mit der höchsten Priorität ausgeben. In etwa so:


Fzg Kategorie1 -- Priorität1 -- Status2
Fzg Kategorie2 -- Priorität1 -- Status2
Fzg Kategorie3 -- Priorität3 -- Status2 (hier sind die Priors 1 und 2 bereits in Status3)
Fzg Kategorie4 -- Priorität2 -- Status2

Hier mein Versuch einen Query zu bauen, der aber nicht funktioniert.

PHP:
$res = mysql_query("SELECT LEAST(vehicle_priority) FROM cd_vehicle WHERE ( SELECT * FROM cd_vehicle WHERE vehicle_category IN ($responseQuery) AND vehicle_status = 'S2' )" );

Liege ich richtig mit der LEAST Funktion? Ist das so überhaupt möglich in einer Abfrage?
Ich habe auch schon versucht einen VIEWTABLE aus der ersten Abfrage zu bilden und dann erneut ein Query zu starten aber das hat auch nicht ge****t.

Oder ist es geschickter die überflüssigen Fzg mit PHP herauszufiltern?

Hat jemand einen Tipp für mich, ich komme hier nicht mehr wirklich weiter.
 
Ich hoffe, ich habe das Problem verstanden, ganz sich bin ich mit allerdings nicht.
In MSSQL gäbe es dafür "TOP":
SQL:
Select TOP(1) vehicle_priority, category,status from cd_vehicle
Ich glaube, in mysql gibt es TOP nicht, daher müsste man wohl mit "ORDER BY priority" und LIMIT 1 arbeiten...
 
Danke erst mal für die schnellen Antworten. Ich tappe jedoch weiterhin im dunkeln.

Wieder mal ein Fall für:
MySQL Aktuelle Einträge pro Gruppe auslesen
Diesen threat hatte ich auch schon gelesen, aber ich konnte und kann es immer noch nicht auf mein spezielles problem anwenden.

Ich möchte die bereits vorhandene Ausgabe (nur noch) auf 1 Datensatz mit gewichteter Priorität pro Kategoriepärchen ausgeben.

In diesem Fall kann ich nicht zuerst nach der höchsten Priorität suchen, weil dazu ja der Status der Fahrzeuge der aber dynamisch ist zuerst angewendet werden muss.

Ich koch mal Kaffee und setz mich nochmal dran.
 
Du suchst pro Status den Eintrag mit der höchsten Prio. Etwa so:
SQL:
SELECT
	cd_v.*
FROM
	(
		SELECT  
			vehicle_status,
			vehicle_category,
			MAX(vehicle_priority) AS max_vehicle_priority
		FROM
			cd_vehicle
		GROUP BY
			vehicle_status,
			vehicle_category	
	) AS max_v
	INNER JOIN cd_vehicle AS cd_v
		ON max_v.vehicle_status = cd_v.vehicle_status
		AND max_v.vehicle_category = cd_v.vehicle_category
		AND max_v.max_vehicle_priority = cd_v.vehicle_priority
WHERE
	cd_v.vehicle_category IN ($responseQuery)
	AND AND cd_v.vehicle_status = 'S2'
 
Kaffeerausch = ja , Erleuchtung = nein

Ich habe mir die Beispiele mit Hilfe der MySQL Referenz noch einmal genau angesehen, komme aber jedoch leider immer noch nicht zu einem Ergebnis.

Vielleicht reden wir auch aneinander vorbei?

Hier noch einmal zur Verständigung was ich genau ausgeben möchte...

Es handelt sich um Feuerwehrfahrzeuge die bestimmten Kategorien angehören z.B.
Einsatzleitfahrzeuge, Tanklöschfahrzeuge, Hubrettungsfahrzeuge, Rettungswagen usw.

Der Status2 besagt das die Fahrzeuge einsatzbereit auf der Wache stehen.

Die Priorität (R1, R2, R3) ist die Reihenfolge in der die Fahrzeuge alarmiert werden. Also zum z.B. 1. Rettungswagen, 2. Rettungswagen usw.

Im Alarmfall möchte ich je nach Schadenslage eine Ausgabe wie folgt:

1 Einsatzleitwagen
1 Tanklöschfahrzeug
1 Rettungswagen

Mein bisheriges Query liefert bereits eine Ausgabe aller verfügbaren Fahrzeuge von benötigten Kategorien.

PHP:
$responseQuery = "'AR','EMS','FT','CC'";
$res = mysql_query("SELECT * FROM cd_vehicle WHERE vehicle_category IN ($responseQuery) AND vehicle_status = 'S2'");

Gelieftert wird folgende Tabelle:

Bull Tanker ???? ????? 27076 BT R1 S2
Ambulance ????? 27026 EMS R1 S2
Turntable Ladder ??? ????? 27510 AR R2 S2
Ambulance ????? 27021 EMS R2 S2
Bronto Skylift ????? 27472 AR R1 S2
Ambulance ????? 27444 EMS R3 S2

Das sind alle Verfügbaren Fahrzeuge, jetzt benötige ich aber aus dieser Tabelle nur jeweils eins pro Kategorie mit der höchsten Priorität.

---

Ich konnte das vorzeitige ermitteln von MAX(vehicle_priority) nicht nachvollziehen weil die ja bevor die Abfrage der Kategorien eingeht noch gar nicht feststeht und auch abhängig von den Statis der Fahrzeuge ist... ( mein 1. Rettungswagen ist ja nicht verfügbar wenn er schon im Einsatz ist, folglich hat RTW 2 (mit der Priorität2) die höchste priorität...

uiuiui...

da hab ich mir was eingebrockt ;o) aber spass machts auf jedenfall!
 
Zuletzt bearbeitet:
Zurück