2 Spalten einer Tabelle miteinander vergleichen

Observer

Well-known member
ID: 351549
L
29 Mai 2009
260
20
Hi, meine Frage.

Ich habe eine Tabelle mit 3 Spalten.
userid=u friendid=f und quest=q

Folgendes Szenario.
u f q
1 2 1
2 1 1

Wie prüfe ich jetzt ob es einen gleichen wert gibt über die beiden spalten userid und friendid.

Also praktisch im Kreuz abgefragt.
Wenn es die userid 1 gibt mit der friendid 2, sollte es auch die userid 2 mit der friendid 1 geben.

Wie frage ich das ab ?

Vielen dank im voraus für die Bantwortung.

MfG Observer
 
Noch nie probiert aber wie sieht's mit folgendem aus:
Code:
SELECT
  u1.*
FROM
  users u1,
  users u2
WHERE
  u1.uid = u2.friend_id AND
  u1.friend_id = u2.uid
Damit sollten doch eigentlich nur freundschaften auftauchen die auch in der gegenrichtung da sind. Etwas ineffizient (n^2 komplexitaet) aber nichts was MySQL nicht verkraftet :D

HTH
 
Etwas ineffizient (n^2 komplexitaet) aber nichts was MySQL nicht verkraftet :D
Wenn Indexe auf den beiden Attributen liegen, müsste das eigentlich recht flott gehen.

Ich glaube auch nicht wirklich, dass es einfacher als mit dem Auto-JOIN geht. Immerhin muss du ja für jeden User jeden anderen User überprüfen, d.h. bist immer schon mal in O(n²).

Die einzige Alternative, die mir jetzt (ja, es war schon spät :biggrin:) einfallen würde, ist es, die komplette Tabelle zweimal abzurufen (oder einmal und in PHP dann den Rest machen). Einmal nach u, einmal nach f, aber mit Sortierung. Und dann die eine Tabelle durchgehen und in der sortierten anderen Tabellen den Freund suchen.
Komplexität wäre n für die eine Tabelle und für die andere Tabelle "fast n", gesamt "n * fast n", also wieder O(n²).

Drum denk ich mal, du kannst die Arbeit gleich dem MySQL-Optimierer machen lassen. Der versteht schließlich sein Handwerk.
 
Alternativen fallen mir genug ein ...

correlated subquery z.B.

PHP:
SELECT benötigte-Daten
FROM users A
WHERE EXISTS
( SELECT * FROM users B
  WHERE A.userid = B.friendid
  AND A.friendid = B.userid )

oder uncorrelated subquery

PHP:
SELECT benötigte-Daten
FROM users A
WHERE ( userid , friendid ) IN
( SELECT friendid,userid
FROM users B )

aber der Join ist im allgemeinen die sinnvollere Variante.
gegebenenfalls kann man den Join noch optimieren:

PHP:
SELECT a.benötigte-Daten, b.benötigte-Daten
FROM users A inner join users B
ON a.userid = b.friendid
AND a.friendid = b.userid
AND a.userid < b.userid

wenn man die Daten beider beteiligter Partner ausliest, kann man die zusätzliche Begrenzung
a.userid < b.userid
einbauen