Danielmauch: Counter über 2 Spalten

Hallo

ich habe eine Tabelle mit

userid_1  userid_2
23        45
53        23
23        45
45        23
45        23
23        77

was ich möchte wäre einen counter der die Häufigkeit zählt und gruppiert - so dass nur eine Paarung von userid_1 und user_id2 vorkommt:

userid_1  userid_2  counter
23        45        4
53        23        1
23        77        1

Ideen????

  1. Hi,

    was ich möchte wäre einen counter der die Häufigkeit zählt und gruppiert - so dass nur eine Paarung von userid_1 und user_id2 vorkommt:

    Ideen????

    Einfach machen?

    Gruppieren kann man schließlich nach mehr als einem Kriterium.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Hallo,

    userid_1  userid_2
    23        45
    53        23
    23        45
    45        23
    45        23
    23        77

    was ich möchte wäre einen counter der die Häufigkeit zählt und gruppiert - so dass nur eine Paarung von userid_1 und user_id2 vorkommt:

    userid_1  userid_2  counter
    23        45        4
    53        23        1
    23        77        1

    offensichtlich ist es Dir gleichgültig, ob userid_1 aus userid_1 oder userid_2 stammt :-)

    Wenn die Werte in den beiden Spalten stets ungleich sind, so kannst Du Dich auf den Fall beschränken, dass der Wert in der ersten Spalte kleiner ist als der Wert in der zweiten Spalte:

    a) wir formen die Ausgangsdaten entsprechen um:

    SELECT  
       userid_1 user1,   -- die Spaltennamen des ersten Selects bestimmen die  
       userid_2 user2    -- Spaltennamen des Resultats, hier mit Aliasnamen  
    FROM  
       tabelle  
    WHERE  
       userid_1 < userid_2  
    -- und fügen anschließend alle Werte ein, bei denen der Wert in der zweiten  
    -- Spalte kleiner ist als in der ersten.  
    UNION ALL  
    SELECT  
       userid_2,  
       userid_1  
    FROM  
       tabelle  
    WHERE  
       userid2 > userid_1
    

    Diese Ergebnismenge dient uns als Ausgangspunkt für das Gruppieren und Zählen:

    SELECT  
       s.user1,  
       s.user2,  
       COUNT(*) counter  
    FROM (  
        SELECT  
           userid_1 user1,  
           userid_2 user2  
        FROM  
           tabelle  
        WHERE  
           userid_1 < userid_2  
        UNION ALL  
        SELECT  
           userid_2,  
           userid_1  
        FROM  
           tabelle  
        WHERE  
           userid2 > userid_1  
    ) s                             -- es ist wichtig, der inneren Abfrage einen  
                                    -- Namen zu geben!
    

    liefert mit Deinen Ausgangsdaten:

    user1  user2  counter
    ---------------------
      23     45      4
      23     53      1
      23     77      1

    mit der von mir genannten Einschränkung das von Dir gewünschte Resultat.

    Dürfen auch gleiche Werte vorkommen, so ersetze einen der beiden Operatoren durch einen, der auch auf Gleichheit passt.

    Freundliche Grüße

    Vinzenz

    1. Ach Ingrid,

      Diese Ergebnismenge dient uns als Ausgangspunkt für das Gruppieren und Zählen:

      Gruppieren auch nicht vergessen!

      SELECT  
         s.user1,  
         s.user2,  
         COUNT(*) counter  
      FROM (  
          SELECT  
             userid_1 user1,  
             userid_2 user2  
          FROM  
             tabelle  
          WHERE  
             userid_1 < userid_2  
          UNION ALL  
          SELECT  
             userid_2,  
             userid_1  
          FROM  
             tabelle  
          WHERE  
             userid2 > userid_1  
      ) s                             -- es ist wichtig, der inneren Abfrage einen  
                                      -- Namen zu geben!  
      GROUP BY  
          s.user1,  
          s.user2  
      
      

      Vergessliche Grüße

      Vinzenz

      1. Super vielen Dank ,

        aber ich bekomme:
        userid_1  userid_2  counter
        45        45        4
        23        23        4
        23        53        1
        53        23        1
        77        23        1
        23        77        1

        was is den falsch?

        Ach Ingrid,

        Diese Ergebnismenge dient uns als Ausgangspunkt für das Gruppieren und Zählen:

        Gruppieren auch nicht vergessen!

        SELECT

        s.user1,
           s.user2,
           COUNT(*) counter
        FROM (
            SELECT
               userid_1 user1,
               userid_2 user2
            FROM
               tabelle
            WHERE
               userid_1 < userid_2
            UNION ALL
            SELECT
               userid_2,
               userid_1
            FROM
               tabelle
            WHERE
               userid2 > userid_1
        ) s                             -- es ist wichtig, der inneren Abfrage einen
                                        -- Namen zu geben!
        GROUP BY
            s.user1,
            s.user2

        
        >   
        > Vergessliche Grüße  
        >   
        > Vinzenz
        
        1. Hallo,

          aber ich bekomme:
          userid_1  userid_2  counter
          45        45        4
          23        23        4
          23        53        1
          53        23        1
          77        23        1
          23        77        1

          was is den falsch?

          SELECT
                 userid_1 user1,
                 userid_2 user2
              FROM
                 tabelle
              WHERE
                 userid_1 < userid_2

          UNION ALL
              SELECT
                 userid_2,
                 userid_1
              FROM
                 tabelle
              WHERE

          -- das da:
          -- » »        userid_2 > userid_1
          -- muss heißen
                        userid_1 > userid_2

          ) s                             -- es ist wichtig, der inneren Abfrage einen
                                          -- Namen zu geben!
          GROUP BY
              s.user1,
              s.user2
          [/code]

          merke: schreibe nicht einfach ab, sondern versuche das Prinzip zu verstehen und verbessere die Leichtsinnsfehler ...

          Freundliche Grüße

          Vinzenz

  3. Hi,

    ich habe eine Tabelle mit

    userid_1  userid_2
    23        45
    53        23
    23        45
    45        23
    45        23
    23        77

    was ich möchte wäre einen counter der die Häufigkeit zählt und gruppiert - so dass nur eine Paarung von userid_1 und user_id2 vorkommt:

    userid_1  userid_2  counter
    23        45        4
    53        23        1
    23        77        1

    ich würde zunächst mal die einzelnen Tupel nach Größe sortieren:
    Also z.B.

    SELECT  
      LEAST(userid_1, userid_2) AS u1,  
      GREATEST(userid_1, userid_2) AS u2  
    FROM yourtable
    

    Das Ergebnis sollte nun sein:

    userid_1  userid_2
    23        45
    23        53
    23        45
    23        45
    23        45
    23        77

    Hiernach kannst du nun einfach gruppieren:

    SELECT  
      t.u1,  
      t.u2,  
      COUNT(*)  
    FROM (  
    SELECT  
      LEAST(userid_1, userid_2) AS u1,  
      GREATEST(userid_1, userid_2) AS u2  
    FROM yourtable  
    ) t  
    GROUP BY t.u1, t.u2
    

    Ungetestet.

    Bis die Tage,
    Matti