NutzerID gruppieren bei 2 Spalten?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • NutzerID gruppieren bei 2 Spalten?

    hi!
    normalerweise kann man ja per group werte zusammenfassen.

    jetzt habe ich aber eine gruppen tabelle:

    Spalte "GruppenID"
    Spalte "Besitzer"
    Spalte "Gast"

    jetzt habe ich zum test 2 datensätze

    der erste:

    23 345 879
    89 879 345

    das bedeutet einmal ist nutzer 1 der besitzer und er hat einen gast mit der nummer 879

    und in der 2. gruppe ist dafür 879 der besitzer und der 1. nutzer ist diesesmal gast in einer anderen gruppe.

    jetzt habe ich bei der ausgabe (eine art übersicht) den nutzer 879 2x und den nutzer 345 auch 2x.

    kann man es so zusammenfassén, das beide spalten von sql geprüft werden und dort die doppelten werte im ergebnis raus genommen werden?
    Zuletzt geändert von Gamer20; 07.01.2013, 11:53.

  • #2
    Hallo,

    versuch mal sowas wie
    Code:
    GROUP BY CONCAT_WS('-', LEAST(besitzer, gast), GREATEST(besitzer, gast))
    Das Problem dabei ist, dass du dann nur einen der beiden Datensätze bekommst und damit 345 entweder nur noch als Besitzer oder nur noch als Gast auftaucht. Besser wäre es, das in MySQL nicht zu gruppieren, sondern in PHP mit einem Gruppenwechsel zusammenzufassen.

    Gruß,

    Amica
    Zuletzt geändert von AmicaNoctis; 07.01.2013, 13:23.
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      ja das ist das problem, nur es gibt ja nun mal die möglichkeit einen kumpel (kontakt) in seine fangruppe einzuladen und der andere Kumpel lädt wiederrum den anderen kumpel in SEINE gruppe ein.

      aber so wie es aussieht, scheint es zu klappen, die doppelten einträge sind weg.

      den befehl kannte ich noch nicht.


      jetzt will ich vorher die einträge zählen, aber da zeigt er mir nur Menge 1 an, es müßten aber 3 einträge sein (2 normale und eben der 1 doppelte der vorher zuviel angezeigt wurde).

      vorher waren es 4 (war ja 1 zuviel) und jetzt zeigt er mir aber nur 1 an. komisch, anhand dieser befehlskette, gibt er aber in der while schleife ja 3 datensätze aus, also müßte der bei dem vorherigen aufruf ja auch 3 ID's zählen und nicht nur 1???

      SELECT COUNT(ID)...
      Zuletzt geändert von Gamer20; 07.01.2013, 17:58.

      Kommentar


      • #4
        Zitat von Gamer20 Beitrag anzeigen
        tja das forum ist doch net sp übel wie ich dachte (obwohl es den einen oder anderen muffel hier gibt).
        [..]
        was läuft denn da im hintergrund ab vor eine sortierung?
        Solche Fragen sind es meist, die dazu führen können, etwas mufflig zu werden, denn was diese Funktionen machen, steht im Handbuch. Da ich beschlossen habe, etwas geduldiger zu werden, erkläre ich es dir aber trotzdem:

        LEAST() gibt den kleinsten der übergebenen Werte zurück, GREATEST() den größten. CONCAT_WS(s, a, b) verbindet die Strings a und b mit dem Separator s. Der ganze Ausdruck gibt also einen String zurück, in dem die beiden IDs von Besitzer und Gast enthalten sind und zwar immer mit der kleineren ID vorn und der größeren hinten, unabhängig davon, welche von beiden Besitzer ist und welche Gast.

        Dadurch erhältst du für beide Datensätze den Wert "345-879" und kannst damit die Gruppierung vornehmen.

        Edit: Das mit der Zählung musst du genauer erklären, ich kann dir da nicht folgen.

        Amica
        Zuletzt geändert von AmicaNoctis; 07.01.2013, 18:05.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          ich wollte eine sql anweisung vorher, die menge der gefundenen einträge in der überschrift der entsprechenden gruppe ausgeben.

          so das eben die leute wissen, wieviele mitglieder vorhanden sind.

          das ist die while schleife bei der es funktioniert:

          Code:
          $ausgabe = mysql_query("SELECT ID,Besitzer,Gast 
          FROM gruppepers 
          WHERE Besitzer = '$ID' OR Gast = '$ID'
          GROUP BY CONCAT_WS('-', LEAST(Besitzer, Gast), GREATEST(Besitzer, Gast))
          ORDER BY ID LIMIT $start,$Schritt");
          vorher wollte ich die einträge zählen (alter code, der mir Summe 4 ausgibt, statt 3):

          Code:
          $Anzahl	= mysql_result(mysql_query("SELECT COUNT(ID) 
          FROM gruppepers WHERE Besitzer = '$ID' OR Gast = '$ID'"),0);
          Zuletzt geändert von Gamer20; 07.01.2013, 18:49.

          Kommentar


          • #6
            Dann kannst du doch den alten Code nehmen, um die Mitglieder zu zählen, wenn der schon das richtige Ergebnis liefert und danach dann halt die gruppierte Abfrage ausführen. Ich versteh das Problem nicht, weil es so klingt, als hättest du gar keins. Liste doch mal die Beispieldatensätze auf (du redest von vieren, hast aber bisher nur zwei gezeigt) und erklär daran dann, was du gerne haben willst.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              der alte zählcode gibt ja nicht die richtige menge an, der gibt ja 4 aus.

              DS gruppe besitzer gast

              1 31 345 591
              2 22 345 879
              3 87 289 345
              4 87 879 345

              die gruppenID ist hier nicht von belangen.

              es müßte folgende datensätze ausgegeben werden (was es anscheinend bei der while schleife macht -> mit deiner modifikation)

              1,2,3

              datensatz 4 ist zuviel, da es ihn ja schon unter nr.2 in umkegehrter teihenfolge gibt.

              soweit scheint ja alles zu klappen.

              die whileschleife ist die 2. SQL abfrage in meinem PHP script.

              jetzt das PROBLEM bei der 1. abrage, die NUR die einträge zählt, für die überschrift.

              dort müßte die summe "3" ausgegeben werden. da datensatz 1,2,3 korrekt ist (die 4 nicht).

              mit meinem alten code für das zählen der datensätze, wird aber eine summe von 4 datensätzen ermittelt (ohne CONCAT_WS).

              mit CONCAT_WS wird mir unter $Anzahl nur die menge "1" ausgegeben, es sind aber 3 datensätze.

              Kommentar


              • #8
                D. h. Datensatz 4 soll ubersprungen werden, weil er bei „gruppe“ denselben Wert hat, wie schon Datensatz 3, richtig?

                Dann mach doch die COUNT()-Abfrage einfach mit „GROUP BY gruppe“.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  hmm ich glaube das was ich machen will, wird mit sql nicht funktionieren.

                  geh mal von kontaktlisten aus.

                  wenn ich jemand in meiner liste habe, hat der andere nutzer mich ja auch in seiner liste.

                  was wenn der 2. nutzer mir nochmal eine anfrage schickt (für eine andere gruppe), von sich aus (vorher habe ICH ihm eine einladung geschickt).

                  ich diese dann bestätige, dann wird wieder ein neuer datensatz erzeugt, nur in umgekehrte reihenfolge der nutzer id.

                  Datensatz2 -> 345 879 (1. anfrage für meine fangruppe)

                  Datensatz4 -> 879 345 (2. anfrage vom kumpel für seinen sportverein)

                  indem fall werden wird mir beide datensätze ausgegeben.

                  Abfrage:
                  "Besitzer = '$ID' OR Gast = '$ID'" // $ID ist meine eigene nutzerid, die zu meinem konto gehört.

                  weil meine ID in beiden datensätzen drin steht.

                  jetzt will ich eine liste erzeugen, in der drin steht, mit wem ich im kontakt stehe.

                  also muß ich ja prüfen in welcher spalte meine ID drin steht (Besitzer = '$ID' OR Gast = '$ID')

                  und dann wird dieser datensatz genommen und die nutzerID ausgegeben, die NICHT meiner ID entspricht.

                  ich kann ja leider nicht nur 1 spalte prüfen, da ich ja nicht vorher weiß, ob ICH eine einladung bestätigt habe (als gast) oder ob ich eine raus geschickt habe -> besitzer (kontaktanfrage).

                  [COLOR="Red"]gedanklich müßte ich [/COLOR]

                  suchanfrage 1:

                  - in spalte 1 (besitzer), in allen datensätzen prüfen ob meine ID drin steht
                  - dann von der gegenüberliegenden spalte die ID nehmen

                  suchanfrage 2:

                  - in spalte 2 (gast), in allen datensätzen prüfen ob meine ID drin steht
                  - dann von der gegenüberliegenden spalte die ID nehmen


                  und dann doppelte ID's raus löschen, so das jede ID nur 1x drin steht

                  und dann erst das ERG per while schleife ausgeben.

                  tja naja das wars dann wohl, ich danke dir trotzdem für dieses komplizierte problem.

                  Kommentar

                  Lädt...
                  X