Sascha D.: zwei tabellen und ORDER BY

Hallo zusammen.

Ich habe 2 Tabellen in einer SQL DB (als Beispiel):

Tab X:
+------+-----------+
|Inhalt|Datum      |
+------+-----------+
|x5    |16.4.04    |
|x4    |1.4.04     |
|x3    |17.3.04    |
|x2    |12.2.04    |
|x1    |1.1.04     |
+------+-----------+

Tab Y:
+------+-----------+
|Inhalt|Datum      |
+------+-----------+
|y5    |14.4.04    |
|y4    |15.3.04    |
|y3    |14.3.04    |
|y2    |13.2.04    |
|y1    |15.1.04    |
+------+-----------+

Nun möchte ich mit einem SQL Befehl:
beide Tabellen verbinden,
nach Datum sortieren und
die letzten (neusten) Acht ausgeben!

Die Ausgabe sollte also dann so aussehen:
(Datum nur zur veranschaulichung)
x5  (16.4.04)
y5  (14.4.04)
x4  (1.4.04)
x3  (17.3.04)
y4  (15.3.04)
y3  (14.2.04)
y2  (13.2.04)
x2  (12.2.04)

Ich habe jetzt schon 3 Std. im Archiv gesucht und auch gegoogeld
bis der Artz kommt !
Konnte aber keine passende Lösung finden.

Ich hab auch schon mit JOIN und GROUP rumexperimentiert,
aber alles vergebenss.

Ist dies mit einer reinen SQL Abfrage überhaubt möglich,
oder muß ich dies in PHP lösen (also mit Arrays und so)?

Danke für Eure Hilfe im voraus!!

MfG

  1. yo,

    beide Tabellen verbinden,

    UNION heisst dafür das zauberwort, um zwei abfragen miteinander zu verbinden, die man nicht so einfach über die inhalte miteinander verbinden kann.

    nach Datum sortieren und

    das wird schon schwieriger, da ORDER BY sich nur auf eine der UNION abfragen beziehen wird. eventuell könnte man den man es mit Unterabfragen lösen. sprich den UNION statement als tabelle in einer anderen abfrage ausgeben lassen und dann dort sortieren. das kommt aber sehr auf dein dbms und der version an.

    die letzten (neusten) Acht ausgeben!

    auch das hängt sehr start davon ab, welches dbms du verwendest.

    ohne genauer darüber nachzudenken, so rein vom gefühl her könnte man eventuell einen FULL JOIN benutzen, in kombination mit DISTINCT, if funktion und LIMIT falls du mysql benutzt.

    Ilja

  2. Hallo,

    Nun möchte ich mit einem SQL Befehl:
    beide Tabellen verbinden,

    UNION

    nach Datum sortieren und

    ORDER BY

    die letzten (neusten) Acht ausgeben!

    LIMIT bzw. TOP, je nach DBMS.

    Für MySQL siehe
    http://dev.mysql.com/doc/mysql/en/union.html

    http://dev.mysql.com/doc/mysql/en/sorting-rows.html

    http://dev.mysql.com/doc/mysql/en/select.html
    hier nach LIMIT suchen.

    Übrigens: Dass man UNION-Selects benötigt, deutet meist auf Fehler bei der Tabellenstrukturierung hin. Wozu gibt es die beiden Tabellen mit identischer Struktur in _einer_ Datenbank?

    viele Grüße

    Axel

    1. Hi,

      Übrigens: Dass man UNION-Selects benötigt, deutet meist auf Fehler bei der Tabellenstrukturierung hin. Wozu gibt es die beiden Tabellen mit identischer Struktur in _einer_ Datenbank?

      huestl, warum solten denn zwei Tabellen zwingenderweise eine identische Struktur haben, wenn mit dem UNION-Operator gearbeitet wird? Und was heisst "hindeuten"?   ;-)

      Gruss,
      Ludger

  3. Ja erstmal danke für die schnellen Antworten!

    Ich habs mir schon gedacht, das dies nicht so einfach zu lösen sein wird.

    Ich werde Eure Vorschläge, besonders den UNION befehl, mal ausprobieren, aber ich denke ich werd einfach die beiden tabellen in arrays packen und dort bearbeiten, sortieren und dann ausgeben.

    zu Axel:

    Übrigens: Dass man UNION-Selects benötigt, deutet meist auf Fehler bei der Tabellenstrukturierung hin. Wozu gibt es die beiden Tabellen mit identischer Struktur in _einer_ Datenbank?

    In den beiden Tabellen steht in wirklichkeit natürlich noch mehr und voneinander unterschiedlicher Inhalt bzw. Spalten drin.
    Die beiden Spalten (Inhalt,Datum)in den Beispieltabellen sind nur die Hauptkriterien um die es sich dreht.

    Falls noch jemand Ideen, Lösungen oder Vorschläge hat,
    dem wäre ich sehr dankbar.

    Sascha

    1. yo,

      Falls noch jemand Ideen, Lösungen oder Vorschläge hat,
      dem wäre ich sehr dankbar.

      du wirst keine konkrete hilfe bekommen, solange du uns nicht das wichtigste verräst, welches dbms und welche version du benutzt. das ist dir scheinbar entgangen.

      Ilja

      1. ist mit dbms das Datenbanksystem gemeint?

        Wenn ja dann:

        MySQL 4.1.10

        Sascha

        1. yo,

          MySQL 4.1.10

          das ist doch schon mal ein wort, was ein wenig mehr klarheit bringt. ich würde aber nochmal das von Axel angesprochene Daten-layout erwähnen. es muss nicht zwangsläufig so sein, dass man es verbessern könnte. aber in vielen fällen ist es oftmals besser, das datenbank-design noch einmal zu überdenken, als solche abfragen zu bauen. wie dem auch sei, gehen wir mal davon aus, es läßte sich nicht ändern oder ist alles in ordnung damit.

          der erste weg, der mir einfällt, du könntest alle datensätze beider tabellen in eine temporäre tabelle schreiben und dort dann einen einfachen SELECT mit ORDER BY und LIMIT machen. falls du das nicht willst, dann versuch mal folgende abfrage.

          SELECT DISTINCT IF(x.datum >= y.datum, x.inhalt, y.inhalt) AS Inhalt,
          IF(x.datum >= y.datum, x.datum, y.datum) AS Datum
          FROM x, y
          ORDER BY 2 DESC
          LIMIT 0, 8

          Ilja

          1. Ja 100000*10³ Dank :-)

            Das funzt !

            Cool :-)

            Das mit der temp.-tabelle hatte ich mir auch schon überlegt, wollte es aber lieber so gelöst haben!

            Und das Layout der Tabellen ändern währe zwar möglich, aber
            dann müßte ich den ganzen PHP Code ändern, denn es basiert bereits alles darauf.
            Ausser dieser letzten abfrage ist nämlich schon alles fertig.

            Aber dank Dir kann ich das ja sparen.

            Nochmals 1000 Dank.

            Gruß Sascha