Announcement

Collapse
No announcement yet.

Entweder Oder Ergebnisse verknüpfen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Entweder Oder Ergebnisse verknüpfen

    Hallo zusammen,

    ich arbeite zwar schon ein paar Tage mit mySQL aber ich bin gerade auf ein Problem gestoßen, dessen Lösung mir nicht einfallen mag. Ich hoffe, einer von euch kann mir einen Tipp geben, wie bzw. ob sich das Problem in einem SQL Statement lösen lässt

    Es ist eigentlich ganz simpel. Ich habe eine Tabelle, die nur aus zwei Feldern besteht. Nennen wir sie der Einfachheit halber mal "friendslist"

    Code:
    +---------------------+
    | user_id1 | user_id2 |
    +---------------------+
    | 1        | 2        |
    | 2        | 3        |
    | 2        | 42       |
    | 51       | 2        |
    | 44       | 1        |
    | 3        | 1        |
    +---------------------+
    Was ich jetzt bräuchte ist ein SQL Statement, das mir user_id1 oder user_id2 liefert, wenn das entgegengesetzte einem bestimmten Wert entspricht. Also im Grunde will ich

    SELECT user_id1 FROM friendslist WHERE user_id2=x
    SELECT user_id2 FROM friendslist WHERE user_id1=x

    Damit ich das Ergebnis wiederum als Liste für die Abfrage in der User-Tabelle nutzen kann. Also so:
    SELECT users.id, users.user_login FROM users WHERE id IN (SELECT user_id1 FROM friendslist WHERE user_id2=2)
    nur halt mit beiden Ergebnissen.

    Ich kann die beiden Ergebnislisten natürlich in PHP durch ein Array laufen lassen und dann wieder in die User-Abfrage einbauen. Aber mir wäre es lieber wenn das in einer SQL Abfrage unterzubringen geht. Ist das irgendwie möglich?

  • #2
    Also im Grunde will ich

    SELECT user_id1 FROM friendslist WHERE user_id2=x
    SELECT user_id2 FROM friendslist WHERE user_id1=x
    Hier bietet sich UNION an.
    Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

    Comment


    • #3
      UNION hatte ich tatsächlich noch nie benutzt, funktioniert aber in der Tat wunderbar. Vielen Dank für die schnelle und kompetente Hilfe

      Comment


      • #4
        Ich brauche doch noch mal Hilfe. Nachdem ich mir den UNION Befehl angeguckt habe, hatte ich erwartet folgendes würde funktionieren:

        SELECT id, user_login FROM users WHERE id IN ((SELECT user_id1 FROM friendslist WHERE user_id2=2) UNION (SELECT user_id2 FROM friendslist WHERE user_id1=2))

        Tut es aber nicht. Ich bekomme einen Fehler am Ende des Statements zurückgeliefert. Einzeln funktionieren der erste SELECT und die UNION SELECTS, aber nicht in dieser Kombination. Kann mir das jemand erläutern?

        Comment


        • #5
          Ich bekomme einen Fehler am Ende des Statements zurückgeliefert.
          Na Klasse.
          Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

          Comment


          • #6
            Und bitte beachten: Formatierung von SQL in Beiträgen
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Ich bekomme einen Fehler am Ende des Statements zurückgeliefert.
              Wäre doch sinnvoll, uns den Fehler mitzuteilen, damit wir weiter 'rätseln' können
              Ein Blick auf deinem Statement sagt mir, der Fehler ist in der Nähe von
              Code:
              UNION (SELECT user_id2...
              zu suchen
              Warum? Ein UNION innerhalb von IN ist schlichtweg falsch.

              Um zu Deinem gewünschten Ergebnis (=gebe mir alle UserID's, die in der Tabelle friendslist sowohl in der Spalte user_id1 als auch in der Spalte user_id2 enthalten sind) zu kommen, reicht ein OR in der WHERE-Klausel aus:

              Code:
              SELECT id, user_login
              FROM users 
              WHERE id IN
               (SELECT user_id1 FROM friendslist WHERE user_id2=2)
              OR 
              id IN (SELECT user_id2 FROM friendslist WHERE user_id1=2)
              Ergebnis wären dann beispielsweise die UserID's 1,3,42,51

              EDIT/Nachtrag:

              Gleiches Ergebnis liefert auch das hier mit UNION (wie dibo33 vorgeschlagen hat) - allerdings syntaktisch korrekt:
              Code:
              (
              SELECT id, user_login
              	FROM users
              	WHERE id IN
              		 (SELECT user_id1
              				FROM friendslist
              				WHERE user_id2=2) 
              )
              
              UNION
              
              (
              SELECT id, user_login
              	FROM users
              	WHERE id IN 
              		(SELECT user_id2
              			FROM friendslist
              			WHERE user_id1=2)
              )
              Soll die Ausgabe sortiert sein, so muss zu einem kleinen 'Trick' gegriifen werden, da Ergebnisse mit UNION so ohneweiteres nicht sortierbar sind:

              Code:
              SELECT t.*
              FROM
              (
              
              SELECT id, name
              	FROM users
              	WHERE id IN
              		 (SELECT user_id1
              			FROM friendslist
              			WHERE user_id2=2) 
              
              
              UNION
              
              
              SELECT id, name
              	FROM users
              	WHERE id IN 
              		(SELECT user_id2
              			FROM friendslist
              			WHERE user_id1=2)
              ) t
              ORDER BY t.id
              Zuletzt editiert von raiguen; 23.11.2010, 18:51.

              Comment


              • #8
                Hallo,
                Originally posted by raiguen View Post
                ...Ein Blick auf deinem Statement sagt mir, der Fehler ist in der Nähe von
                Code:
                UNION (SELECT user_id2...
                zu suchen
                Warum? Ein UNION innerhalb von IN ist schlichtweg falsch.
                Wo hast du denn das her? Ein UNION ist ein normales Select-Statement und warum sollte das nicht in IN verwendet werden können?) Falsch sind hier nur die Klammern um die einzelnen Selects.

                Originally posted by raiguen View Post
                ...Um zu Deinem gewünschten Ergebnis (=gebe mir alle UserID's, die in der Tabelle friendslist sowohl in der Spalte user_id1 als auch in der Spalte user_id2 enthalten sind) zu kommen, reicht ein OR in der WHERE-Klausel aus:
                Das ist korrekt, liefert jedoch nicht in jedem Fall dasselbe Ergebnis wie mit dem einzelnen (UNION) Subselect. Ist eine ID sowohl in user_id1 als auch in user_id2 enthalten, werden die DS mit der OR-Verknüpfung zweimal aufgelistet, während beim einzelnen Subselect dieser DS nur einmal auftaucht.


                Originally posted by raiguen View Post
                ...Soll die Ausgabe sortiert sein, so muss zu einem kleinen 'Trick' gegriifen werden, da Ergebnisse mit UNION so ohneweiteres nicht sortierbar sind:
                Wo hast du das nun wieder her? Warum sollte ein UNION-Statement nicht sortiert werden können?
                [highlight=sql]
                select feld from tabA
                union
                select feld from tabB
                order by 1
                [/highlight]

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  @Falk:

                  Originally posted by Falk Prüfer
                  Wo hast du denn das her? Ein UNION ist ein normales Select-Statement und warum sollte das nicht in IN verwendet werden können?) Falsch sind hier nur die Klammern um die einzelnen Selects.
                  Ähm...genaue Quelle kann ich nicht mehr nennen. Mag auch sein, dass ich da etwas verwechselt habe bzw nicht mehr richtig aus meinem grauen Speicher repetiert habe *sorry*
                  Die falsch gesetzten Klammern habe ich dann natürlich auch nicht mehr gesehen

                  Originally posted by Falk Prüfer
                  ...
                  Das ist korrekt, liefert jedoch nicht in jedem Fall dasselbe Ergebnis wie mit dem einzelnen (UNION) Subselect.
                  Okay, da bin ich mit Dir auf dem gleichen Level; bin der Einfachheit halber davon ausgegangen, dass die gesuchte user_id nicht zugleich in beiden Spalten vorhanden ist.

                  Originally posted by Falk Prüfer
                  Wo hast du das nun wieder her? Warum sollte ein UNION-Statement nicht sortiert werden können?
                  Aus den mir zahlreich vorliegend Tut's bzw den Manuals von MySql. Dort ist u.a. auch in den entsprechenden Kommentaren immer die Rede davon, das ein UNION immer ein unsortiertes Ergebnis liefert (weil die ORDER BY - Klause wegoptimiert wird).
                  Dein Beispiel-Statement ist mir zwar bekannt, aber führt angeblich auch nicht immer zum gewünschten Ergebnis (nach meinen Recherchen bzw Erfahrungen).

                  Wenn ich unwissentlich was Falsches gesagt habe, so werde ich das nie wieder tun...

                  Gruß Rainer

                  Comment


                  • #10
                    Hallo Rainer,
                    Originally posted by raiguen View Post
                    ...Aus den mir zahlreich vorliegend Tut's bzw den Manuals von MySql. Dort ist u.a. auch in den entsprechenden Kommentaren immer die Rede davon, das ein UNION immer ein unsortiertes Ergebnis liefert (weil die ORDER BY - Klause wegoptimiert wird).
                    Kannst du mir da mal einen Link zu diesem Tut bzw. dem MySql-Manual posten? Das würde mich dann doch interessieren.
                    Oder hast du doch was falsch interpretiert? Bei einem UNION kann man nämlich für die EINZELNEN Selects keine Order By-Klausel angeben. Das ein Order für die Gesamtabfrage ignoriert wird wäre mir jedoch neu - Was nicht heißen muß das es nicht so ist, bei MySQL muss man manchmal mit allem rechnen

                    Gruß Falk
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment


                    • #11
                      Bei einem UNION kann man nämlich für die EINZELNEN Selects keine Order By-Klausel angeben.

                      Hallo Falk,
                      Hier lese/verstehe ich es so, dass in den einzelnen SELECTs ein Order By syntaktisch richtig ist, aber wegoptimiert wird (=keinerlei Wirkung zeigt).
                      Ein ORDER BY mit LIMIT allerdings sortiert die einzelnen Selects durchaus in der gewünschten Form - wobei dann allerdings ein ORDER BY in der Gesamtabfrage zwar auch syntaktisch richtig ist, aber die Einzelsortierung dann wieder über den Haufen wirft...

                      Möglichwerweise habe ich auch was falsch intgerpretiert...

                      Gruß Rainer
                      Zuletzt editiert von raiguen; 29.11.2010, 15:00.

                      Comment


                      • #12
                        Hallo Rainer,

                        das was da steht kenne ich und das ist auch alles nachvollziehbar. Ich habe jedoch nichts gefunden, aus dem man schlussfolgern müßte das man ein UNION nicht - bzw. nur mit "Tricks" sortieren kann.

                        Mglws. hat dich die Aussage:
                        However, use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result because UNION by default produces an unordered set of rows.
                        etwas verwirrt. Aber dass man ein UNION Resultset als Unsortiert betrachten muss, obwohl die einzelnen Selects sortiert wurden heißt ja nicht, dass man dem UNION nicht durch eine ORDER BY Klausel wieder zu einer Gesamtsortierung verhelfen kann. Im Endeffekt ist jedes SELECT ohne ORDER BY als unsortiert zu betrachten.
                        Das gilt ja z.B. auch für Subselects:
                        [highlight=sql]
                        select * from (
                        select feld from tabelle
                        order by nummer
                        ) subtable
                        [/highlight]
                        Da würde ich mich auch nie darauf verlassen, dass die Ergebnissmenge nach nummer sortiert ist.

                        Gruß Falk
                        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                        Comment


                        • #13
                          Danke Falk für Deine Erklärungen. In der Tat hab ich mich wohl etwas irritieren lassen durch die Aussage, dass SELECTs nicht immer geordnet sind - was ich allerdings auch durch eigene Erfahrungen leidlich 'zu spüren' bekam
                          Ich denke, das Thema ist soweit ausreichend geklärt, Danke nochmal für Deine (mir) hilfreichen Ausführungen

                          Gruß
                          Rainer

                          Comment

                          Working...
                          X