moin,
Etwa 20.000 - also durchaus auch ne Hausnummer. Allerdings brauche ich nur solche Userpaare, die auch wirklich etwas gemeinsam haben. All die, die nichts gemeinsam haben, können ruhig unter den Tisch fallen.
klar, die wird nicht 20.000 * 19.999 user sein.
hmm, mein Problem ist ja leider gerade die Ergebnismenge bzw. die größe jener. Ich versuche also Zwischenergebnisse bereits möglichst klein zu halten, damit das ganze Handhabbar bleibt.
naja, wie groß die ergebnismenge ist, da habe ich die vermutung, das weißt du ja noch gar nicht. erstens war deine abfrage fachlich falsch, zweitens hatte ich den eindruck, sie wäre noch nicht durchgelaufen. wie gesagt, erst mal die richtige ergebnismenge über die selektion ausarbeiten. das heitß noch nicht, dass du konkrete ergebnisse hast, sondern bezieht sich darauf, wie baue ich die abfrage auf.
das bedeutet, das theoretisch jeder user mit jedem user über 20 titel gemeinsam haben kann, spirch ich brauche eine theoretische ergebnismenge von 20.000 x 19.999. das problem dabei ist, dass du die user alle in der userTitel tabelle "versteckt" hast, sprich dort haben wir es mit wesentlich mehr datensätzen zu tun. für die auswertung, die du machen willst ist das nicht optimal. wären die user getrennt in einer extra tabelle, das würde meiner vermutung nach eine menge an zeit sparen und wesentlich perfomanter ablaufen.
wie dem auch sei, so musst du über die wesentlich größere tabelle einen selfjoin machen (anstelle nur über die user), wobei du die user schon im vorfeld auschließen kannst, die keine 20 titel haben. davon nimmst du jeweils nur die eindeutigen user, nicht aber die titel. dann hast du zwei bereinigte mengen an usern, die deine mögliche ergebnismenge darstellen. und dann musst du noch festellen, welche user 20 gemeinsamkeiten mit einem anderen user hast. du siehst, das ist deutlich umständlicher, als wenn die user getrennt in einer extra tabelle sind. das sieht in etwa so aus.
SELECT tab1.UserName, tab2.UserName
FROM (SELECT ut1.UserName
FROM userTitel ut1
GROUP BY ut1.UserName
HAVING COUNT(*) >= 20
) tab1,
(SELECT ut1.UserName
FROM userTitel ut1
GROUP BY ut1.UserName
HAVING COUNT(*) >= 20
) tab2
WHERE tab1.UserName <> tab2.UserName
AND 20 <= (SELECT COUNT(*)
FROM userTitel t1, UserTitel t2
WHERE t1.UserName = tab1.UserName
AND t2.UserName = tab2.UserName
AND t1.titelUrl = t2.titelUrl
)
Ilja