Alles aus 3 Tabellen nach gleicher Spalte sortieren

Scorp1337

Erfahrenes Mitglied
Hallo Comunity,
ich habe drei Tabellen bei denen der Inhalt natürlich unterschiedlich ist.
Alle Tabellen haben eine Titel und eine Datumsspalte.

Beispiel:
Code:
gedicht
ID 	titel	 text 		datum
1	Keks	Blablub		2008-04-09 15:00:00
2	Kuchen	Roflkopter	2008-04-09 18:00:00

film
ID 	titel	 text 		datum
1	Hans	Hansipete	2008-04-09 22:00:00
2	Tom	Scorpion	2008-04-09 05:00:00

buch
ID 	titel 	 text 		datum
1	Heute	Toll		2008-04-09 19:00:00
2	Gestern	Schlecht	2008-04-09 12:00:00
Jetzt möchte ich auf einer Seite von mir aus den drei Tabellen alles rausholen und nach "datum" (Datum & Zeit) sortiert ausgegeben bekommen. Quasi so:
Code:
	titel	text		datum
	Tom	Scorpion	2008-04-09 05:00:00
	Gestern	Schlecht	2008-04-09 12:00:00
	Keks	Blablub		2008-04-09 15:00:00
	Kuchen	Roflkopter	2008-04-09 18:00:00
	Heute	Toll		2008-04-09 19:00:00
	Hans	Hansipete	2008-04-09 22:00:00

Geht das überhaupt? Wenn nicht, habt ihr einen Lösungsvorschlag?
Ich hab bisher diese Abfrage:
Code:
SELECT A.titel AS filmTitel, B.titel AS buchTitel, C.titel AS gedichtTitel FROM film AS A, buch AS B, gedicht AS C ORDER BY datum DESC
Jedoch bezweifle ich ganz stark, dass dabei was bzw. das richtige rauskommt.

Gruß Scorpion
 
Zuletzt bearbeitet:
Code:
$abfrage = "SELECT titel, text, datum FROM film ORDER BY datum DESC
                                UNION
                                SELECT titel, text, datum FROM buch ORDER BY datum DESC
                                UNION
                                SELECT titel, text, datum FROM gedicht ORDER BY datum DESC";
Hab jetzt diese Abfrage, krieg aber folgenden Fehler:
Ung?ltige Abfrage: Incorrect usage of UNION and ORDER BY

Wie kommts? wieso kann ich das oder by nicht benutzen?
 
Du musst natürlich die SELECTs entsprechend klammern. Also z.B.
Code:
(SELECT titel, text, datum FROM film ORDER BY datum DESC)
UNION
(SELECT titel, text, datum FROM buch ORDER BY datum DESC)
UNION
(SELECT titel, text, datum FROM gedicht ORDER BY datum DESC)
oder
Code:
(SELECT titel, text, datum FROM film)
UNION
(SELECT titel, text, datum FROM buch)
UNION
(SELECT titel, text, datum FROM gedicht) 
ORDER BY datum DESC
 
Zuletzt bearbeitet:
Hi,

das müsste eher so aussehen:

PHP:
$abfrage = "(SELECT titel, text, datum FROM film)
            UNION
            (SELECT titel, text, datum FROM buch)
            UNION
            (SELECT titel, text, datum FROM gedicht)
            ORDER BY datum DESC";

LG
 
Hi,

Code:
(SELECT titel, text, datum FROM film ORDER BY datum DESC)
UNION
(SELECT titel, text, datum FROM buch ORDER BY datum DESC)
UNION
(SELECT titel, text, datum FROM gedicht ORDER BY datum DESC)

Die Selects einzeln zu sortieren, macht in der Form allerdings keinen Sinn, da UNION ein unsortiertes Ergebnis zurückliefert. Das kann man in Verbindung mit LIMIT machen, wenn man z.B. nur die 10 aktuellsten aus jeder Tabelle haben will.
Also unbedingt die 2. Variante nehmen. ;)

LG
 
Alles klar!
Vielen Dank Leute, jetzt klappts! =)

....jetzt stellt sich mir nur noch die Frage, wie ich rausbekomme aus welcher Tabelle das ist.
Denn die Tabellen beinhalten noch unterschiedliche Spalten (Buch - Autor, Film - Bild / Bewertung etc etc).

Naja und jetzt wollte ich in das quasi so schreiben:
PHP:
if(tabelle = buch) echo titel - autor
elseif(tabelle = film) echo titel - bewertung - bild
elseif(tabelle = gedicht) echo titel
usw...

Wie kann ich das realisieren? ....oder muss ich jeder Spalte mit z.b. SELECT titel AS filmtitel from film usw.... einen eigenen namen geben, und dann abfragen obs leer ist?

Gruß Scorpion
 
Zuletzt bearbeitet:
Hi,

einfach so:

Code:
(SELECT titel, text, datum, 'film' as tabelle FROM film)
UNION
(SELECT titel, text, datum, 'buch' FROM buch)
UNION
(SELECT titel, text, datum, 'gedicht' FROM gedicht) 
ORDER BY datum DESC

:)

LG
 
Ah okay cool.

Also fügt man quasi einfach eine "spalte" hinzu?

Funktioniert aufjedenfall genau so, wie ich es brauch.

Vielen Dank für alles!

edit
Ich glaube ich hab etwas, was nicht geht oder... Ich will in der gleichen Abfrage, auch nach anderen Spalten abfragen, die nicht in jeder Tabelle vorhanden sind.
Geht das?
Bei folgender erhalte ich einen Fehler:
Code:
(SELECT titel, text, datum, 'film' AS tabelle FROM film)
UNION 
(SELECT titel, text, datum, autor, 'buch' AS tabelle FROM buch)
UNION
(SELECT titel, text, datum, 'gedicht' AS tabelle FROM gedicht)
ORDER BY datum DESC
 
Zuletzt bearbeitet:
Zurück