Kevin Wiedener: Zwei MySQL-Selects zusammenfügen

Hi Leute,

ich habe das Problem, dass ich zwei eigentlich verschiedene MySQL-Selects zu einem zusammenfügen möchte. Ich habe in der MySQL-Doku gefunden, dass das mit UNION möglich sei, doch da habe ich Probleme. Meine Datenbankabfrage sieht folgendermaßen aus:

$groups_query = "SELECT v.group_id, v.group_name AS name FROM groups v, user_groups u WHERE (u.user_id = '" . $add_array['ID'] . "' AND v.group_id = u.group_id) UNION JOIN SELECT w.ranks_id, w.ranks_name AS name FROM ranks w, user_ranks t WHERE (t.user_id = '" . $add_array['ID'] . "' AND w.ranks_id = t.rank_id) ORDER BY name";

Die Abfrage ist zwar syntaktisch korrekt, jedoch kommt es zu folgendem Problem:

Sagen wir z.B. wir suchen nach der ID = 1. Meine Tabellen sehen folgendermaßen aus:
___________________________________
| groups                          |
-----------------------------------

  • group_id = 1, group_name = Test -
    -----------------------------------

_____________________________
| user_groups               |
-----------------------------

  • user_id = 2, group_id = 1 -
    -----------------------------

__________________________________
| ranks                          |
----------------------------------

  • ranks_id = 1, rank_name = Hi   -
    ----------------------------------

_____________________________
| user_ranks                |
-----------------------------

  • user_id = 2, rank_id = 1  -
    -----------------------------

Nun bekomme ich also folgende Ausgabe:

-----------------------------

  • group_id = 1, name = Hi   -
  • group_id = 1, name = Test -
    -----------------------------

Dabei sollte folgende Ausgabe eigentlich rauskommen:

-----------------------------

  • ranks_id = 1, name = Hi   -
  • group_id = 1, name = Test -
    -----------------------------

Das UNION überschreibt praktisch meine ranks_id und speichert sie in group_id rein, doch das möchte ich nicht.

Gibt es da keine simple Lösung? Das kann ich mir ja fast nicht vorstellen (ich habs auch schon mit sämtlichen JOINs versucht, aber es ging nicht).

Vielen Dank für Eure Hilfe

Grüßle

Kevin

  1. yo,

    also einen UNION JOIN kenne ich gar nicht. aber mit mysql habe ich auch immer so meine probleme, vielleicht kommt es ja wieder eine so tolle erfindung der mysql crew.

    grundsätzlich macht ein UNION folgendes. er verbindet die ergebnissmenge zweier abfragen, wobei die anzahl der spalten gleich sein muss und doppelte datensätze rausgefilter werden, quasi ein dinstinct ausgeführt wird.

    und wenn ich mir die ergebnisee anschaue, dann sehe ich zumindestens von den werten keine unterschiede, sorich die werte, die du bekommst sind indentisch mit denen, die du willst ?

    Ilja

    1. Hi,

      und wenn ich mir die ergebnisee anschaue, dann sehe ich zumindestens von den werten keine unterschiede, sorich die werte, die du bekommst sind indentisch mit denen, die du willst ?

      Ja, da ist korrekt, nur kann ich danach keine Unterscheidung mehr machen, ob das jetzt ein Ergebnis von der Tabelle ranks oder groups war und diese Unterscheidung brauch ich auf alle Fälle.

      Außerdem will ich auch nicht, dass identische Einträge verloren gehen!

      Kennt keiner eine Lösung?

      Grüßle

      Kevin

      1. yo,

        Außerdem will ich auch nicht, dass identische Einträge verloren gehen!

        Kennt keiner eine Lösung?

        UNION ALL

        Ilja

        1. habe noch vergessen zu sagen, eine unterscheidung der datensätze aus den beiden abfragen kannst du einbringen, indem du eine konstante als dritte spalte mit ausgeben läßt und datensätze aus der ersten abfrage '1' haben und datensätze aus der zweiten abfrage '2'

          Ilja

          1. habe noch vergessen zu sagen, eine unterscheidung der datensätze aus den beiden abfragen kannst du einbringen, indem du eine konstante als dritte spalte mit ausgeben läßt und datensätze aus der ersten abfrage '1' haben und datensätze aus der zweiten abfrage '2'

            Hi Ilja,

            sorry, aber könntest du mir diese UNION ALL-Abfrage mal auf mein Beispiel ummünzen, weil wie krieg ich da ne dritte Spalte rein - das versteh ich irgendwie nicht? Ich krieg da immer n leeres Ergebnis :-(.

            Trotzdem schon mal recht herzlichen Dank

            Grüßle

            Kevin

            1. yo,

              sorry, aber könntest du mir diese UNION ALL-Abfrage mal auf mein Beispiel ummünzen, weil wie krieg ich da ne dritte Spalte rein - das versteh ich irgendwie nicht? Ich krieg da immer n leeres Ergebnis :-

              UNION ALL ist ein schlüsselwort wie UNION, sprich einfach da UNION ALL einsetzen, wo vorher UNION stand. UNION ALL schmeisst doppelte datensätze nicht raus.

              eine dritte spalte bekommst du ganz einfach rein, indem du bei beiden SELECT statements einfach eine weitere spalte zufügst, sprich ein komma + einen string ala:

              SELECT ...., '1' AS spalte3 ....

              Ilja