Artikel mit dem Tag "Tabellen"

MySQL Union: Mehrere Tabellen verbinden, erfahren aus welcher Tabelle Datensatz stammt

Das zugrunde liegende Problem war in diesem Fall, dass ein News-Bereich in mehrere Sektionen unterteilt sein sollte: Aktuelles, Presse, Events. Jede Sektion erhielt eine eigene Tabelle, weil die jeweiligen Datensätze sich geringfügig unterschieden (in der Presse-Sektion gab es immer eine Quelle, in der Events-Sektion eine URL für einen externen Link,..) und um bei den vielen Datensätzen die Lesezeiten so klein wie möglich zu halten (befindet sich ein Benutzer in der Pressesektion, ist es unnötig, auch die Aktuelles- und Events-Datensätze zu durchforsten).

Jedoch sollte auf der Startseite des Projekts eine Art Newsticker eingefügt werden, welcher die aktuellsten fünf Datensätze anzeigt. Das bedeutet, dass aus allen drei Tabellen gelesen und nach einem Zeitkriterium geordnet werden muss. In meinem Fall ist die Zeit in jeder Tabelle im Feld `time` als Timestamp gespeichert. Meine Abfrage, um alle drei Tabellen einzubeziehen, lautet unter Verwendung von MySQL UNION:

(SELECT `id`, `time`, `title` FROM `aktuelles`) UNION (SELECT `id`, `time`, `title` FROM `presse`) UNION (SELECT `id`, `time`, `title` FROM `events`) ORDER BY `time` DESC LIMIT 5

Um die Problematik zu verstehen, die jetzt kommt, ist ein Blick auf die Seitenstruktur des Projekts hilfreich:

  • Startseite (startseite.html)
  • News (news.html)
    • Aktuelles (news/aktuelles.html)
    • Presse (news/presse.html)
    • Events (news/events.html)

Klickt der Benutzer den „weiterlesen…“-Link im Newsticker auf der Startseite, soll er direkt in die entsprechende News-Sektion springen. Dazu muss aber bekannt sein, aus welcher Tabelle der entsprechende Datensatz stammt. Das lässt sich wie folgt umsetzen:

(SELECT 'aktuelles' AS `tbl`, `id`, `time`, `title` FROM `aktuelles`) UNION (SELECT 'presse' AS `tbl`, `id`, `time`, `title` FROM `presse`) UNION (SELECT 'events' AS `tbl`, `id`, `time`, `title` FROM `events`) ORDER BY `time` DESC LIMIT 5

So einfach lässt sich die Herkunft der Datensätze unterscheiden: In den Ergebnissen der Abfrage erscheint nun ein Feld `tbl`, das den Namen der Herkunftstabelle enthält.

Share
Geschrieben von Philip Ehret am 02.10.2009 | Kommentare weiterlesen...