Bei Abfrage Sort nach zwei Feldern zusammenführen?
Kermit
- datenbank
Hi,
arbeite mit MySql und PHP.
Ist es möglich bei einer Abfrage wie:
"select g.info, g.nochmehrinfo, v.info, v.nochmehrinfo, g.stadt, g.land, v.stadt, v.land from g, v order by g.stadt, v.stadt"
die order by Klausel so zu schreiben, daß die Sortierung einfach nach der Stadt geschieht und nicht erst nach g.stadt und dann v.stadt?
Das Problem ist, daß entweder in v.stadt ein Inhalt steht oder in g.stadt (in ganz wenigen Ausnahmen kann es sogar sein, daß in beiden Feldern Infos stehen, aber das ist dann ein Fehler bei der Dateneingabe...)
Möchte bei der Ausgabe das Ergebnis haben:
if ($city != $stadt)
{
echo "$stadt<br>";
$city=$stadt;
}
echo " datensatz<br>";
und somit unter dem jeweiligen Städtenamen die Infos egal ob sie aus der tabelle g oder v kommen.
Bisher ist mir das noch nicht gelungen :-( Bekomme immer erst die Info aus g sortiert nach der g.stadt und dann die Info aus v sortiert nach v.stadt und habe dadurch Doppelungen in der Ausgabe (Hamburg München Köln Hamburg München Köln)....
Grüße,
Kermit
Hi,
die einfachste Variante wäre von Anfang an nur die Stadt-Spalte überhaupt zu selektieren, die überhaupt einen Inhalt hat. Danach kann man dann auch sicher sortieren.
Der SQL-Standard (und auch MySQL bieten hierzu den COALESCE-Operator an, der soviel heißt wie "gib mir aus deinen Argumenten den ersten NICHT-NULL-WERT sofern vorhanden".
SELECT ..., COALESCE(g.stadt, v.stadt) AS stadt
FROM ...
ORDER BY stadt
Sollte das Statement nicht funktionieren, versuch mal einen anderen Namen als stadt zu verwenden, es kann sein, dass das DBMS sich nicht ganz sicher ist welches Stadt gemeint ist.
MfG
Rouven
Hi Rouven,
erstmal vielen Dank für den Tip - aber er funktiniert leider nicht. Es werden mir entweder nur die Städte aus der g oder aus der v Datenbank angezeigt (je nachdem welche ich zuerst innerhalb des COALESCE reinschreibe. Habe den beiden Spalten auch eindeutige Namen zugewiesen, damit da kein Konflikt entstehen kann.
die einfachste Variante wäre von Anfang an nur die Stadt-Spalte überhaupt zu selektieren, die überhaupt einen Inhalt hat
Oh ha, das hatte ich zuerst überlesen, Problem: beide Spalten haben Inhalte, aber eben nicht zu jedem Datensatz (zum einen datensatz hat Tabelle G den Inhalt zum anderen Tabelle V). Möchte mir aber eine Liste mit allen Datensätzen ausgeben.
Grüße,
Kermit
Hi,
Oh ha, das hatte ich zuerst überlesen, Problem: beide Spalten haben Inhalte, aber eben nicht zu jedem Datensatz (zum einen datensatz hat Tabelle G den Inhalt zum anderen Tabelle V). Möchte mir aber eine Liste mit allen Datensätzen ausgeben.
Jaja, genau das ist die Anwendung für COALESCE - das verlässt sich allerdings darauf, dass "kein Inhalt" durch NULL dargestellt ist, NICHT z.B. durch "". Wie ist das bei dir?
MfG
Rouven
Jaja, genau das ist die Anwendung für COALESCE - das verlässt sich allerdings darauf, dass "kein Inhalt" durch NULL dargestellt ist, NICHT z.B. durch "". Wie ist das bei dir?
Mmh,
in den Feldern steht nichts drin...
Allerdings habe ich bei der Eingabe der daten
insert into tabelle
('spalte1', 'spalte2', etc)
wenn keine values angegeben waren
geschrieben
('', '', etc...)
liegt das daran?
Wie kann man den Import von großen Listen denn besser gestalten wenn Felder mal Inhalt mal keinen Inhalt haben?
Grüße,
Kermit
Hi,
wenn keine values angegeben waren
geschrieben
('', '', etc...)
liegt das daran?
ja, genau daran liegt das. Das ist nämlich kein leeres Feld sondern ein befülltest Feld, und zwar befüllt mit dem Wert "leerer String".
Du hast beim Schreiben solcher Sätze zwei Möglichkeiten:
Keine Angabe machen
Funktioniert aber nicht bei
INSERT INTO xyz VALUES ('a', 'b', ...) weil dann die Spaltenzahl nicht stimmt, sondern nur bei
INSERT INTO xzy (Spalte_1, Spalte_2) VALUES ('a', 'b')
Explizite Angabe von NULL (nicht 'NULL')
INSERT INTO xyz VALUES ('a', 'b', NULL)
MfG
Rouven
Hi,
danke für den Tip, werde ich morgen ausprobieren!
Grüße,
Kermit
Hi Rouven,
also haben den Dateninput erneuert mit NULL für leere Felder und das funktioniert nun einigermaßen.
Habe aber trotzdem zwei Probleme:
a) wenn nach den im Coalesce bestimmten Kriterium sortiert wird, werden mir nicht mehr alle abgefragten Inhalte angezeigt (läßt eine Spalte komplett aus...)
b) wenn ich zwei COALESCE Abfragen drin habe also COALESCE(g.stadt, v.stadt) as city, COALESCE(g.land, v.land) as country) gibt es für den zweiten COALESCE keine Ausgabe?
Kann man in einer Abfrage nicht zwei COALESCE machen?
Wäre dankbar, wenn Du mir nochmal helfen könntest.
Liebe Grüße,
Kermit
Halt, halt nehme alles zurück!!!
Funktioniert wunderbar!!!! Hatte einen kleinen Syntaxfehler ...
SUPER TAUSEND DANK GROßES PROBLEM GELÖST!!
Grüße,
Kermit
echo $begrüßung;
Ist es möglich bei einer Abfrage wie:
"select g.info, g.nochmehrinfo, v.info, v.nochmehrinfo, g.stadt, g.land, v.stadt, v.land from g, v order by g.stadt, v.stadt"
die order by Klausel so zu schreiben, daß die Sortierung einfach nach der Stadt geschieht und nicht erst nach g.stadt und dann v.stadt?
Es sollte möglich sein, IF() zu verwenden. Ungefähr so: ORDER BY IF(LEN(g.stadt), g.stadt, v.stadt)
Die NULL-Variante fände ich aber auch sinnvoller.
echo "$verabschiedung $name";