Counter über 2 Spalten
Danielmauch
- datenbank
0 ChrisB2 Vinzenz Mai0 Matti Mäkitalo
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????
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
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
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
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
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 1was 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
Hi,
ich habe eine Tabelle mit
userid_1 userid_2
23 45
53 23
23 45
45 23
45 23
23 77was 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