# MySQL: 2 Tabellen  nach Datum sortieren



## Nord-Süd-Richtung (13. August 2008)

Hi,
da die Suche nichts treffendes ergeben hat frage ich wieder mal euch...
Ich habe zwei Tabellen, und möchte aus beiden die letzten 4 Einträge auslesen, also das es zusammen 4 sind. Für eine Tabelle sähe das ja so aus:

SELECT * FROM table ORDER BY Datum DESC Limit 0,4;

Wenn ich da noch eine andere Tabelle mit reinnehme (ich gehe davon aus das es möglich ist), was muss ich da noch hinzufügen?


----------



## Cojote (13. August 2008)

Du kannst Ergebnismengen in SQL zu einer Ergebnismenge zusammenfassen. Da SQL ja spaltenorientiert arbeitet müssen die zusammenzuführenden Ergebnismengen exkat die gleichen Spalten (gleiche Anzahl, gleiche Datentypen, gleiche Namen in der gleichen Reihenfolge) aufweisen, ansonsten können die Ergebnismengen nicht zu einer vereint werden. Ergebnismengen vereinen kann man mit dem Schlüsselwert UNION.

Willst du beide Tabellen vereinen und dann die letzten 4 Einträge aus beiden Tabellen geht das so:

```
SELECT * FROM (
 (SELECT id, datum, spalte1, spalte2 FROM tableA) UNION (SELECT id, datum, spalte1, spalte2 FROM tableB)) ORDER BY datum DESC LIMIT 0,4
```

Haben die beiden Ergebnismengen jedoch nicht den gleichen Aufbau ist eine Vereinigung unmöglich.


----------



## Cojote (13. August 2008)

Fast vergessen: Neben UNION gibt es noch UNION ALL. UNION filtert Duplikate aus der Schnittmenge, mit UNION ALL kann man die Filterung deakitivieren. Für eine Beschreibung siehe z.B.: http://www.w3schools.com/sql/sql_union.asp


----------



## Nord-Süd-Richtung (13. August 2008)

Danke erstmal für die Antwort.
Ich erhalte jedoch folgende Fehlermeldung bei folgendem Code.

SELECT *
FROM (
(

SELECT id
FROM forum_thr
)
UNION (

SELECT id
FROM forum_post
)
)
ORDER BY Datum DESC
LIMIT 0 , 4

MySQL meldet: Dokumentation
#1248 - Every derived table must have its own alias


----------



## Cojote (13. August 2008)

Sorry die Unterabfragen brauchen scheinbar noch nen Alias.
Aber es fehlt die Spalte Datum in deinen Unterabfragen nach der du die Vereinigungsmenge ja sortieren möchtest.

Die Abfrage dürfte in etwa so aussehen (f_datum und p_datum müssen noch durch die konkreten Spalten ersetzt werden in denen die jeweiligen Datumswerte stehen):

SELECT *
FROM (
(

SELECT id, t_datum AS Datum
FROM forum_thr
) as a
UNION (

SELECT id, p_datum AS Datum
FROM forum_post
) as b
) AS c
ORDER BY c.Datum DESC
LIMIT 0 , 4

Das select * ganz zu anfang bedeutet übrigens dass du alles aus den Unterabfragen zurückbekommst. Das sind im konkreten Fall die Spalte id und die Spalte Datum


----------



## Nord-Süd-Richtung (13. August 2008)

Ok, ich musste noch AS a und AS b löschen, dann klappt es soweit, das ich id 42 erhalte, wobei in  beiden Tabellen keine höher ist als 31.
Werden die zusammen addiert?


----------



## Nord-Süd-Richtung (13. August 2008)

Ich habe es durch eine extra Spalte gelöst, danke trotzdem für deine Geduld


----------

