[SQL] Nicht befreundete Benutzer finden

  • Hallo,


    hab wohl irgendwie in Brett vorm Kopf. Ich hab in einer Datenbank unter anderem zwei Tabellen, users und friends die so aussehen:


    users: [userid] [email] [name]...
    friends: [friendsid] [user1] [user2]


    In der Tabelle "users" werden die Benutzer nach der "userid" sortiert.
    Die Tabelle "friends" enthält die Verbindungen zwischen den Benutzern. Wenn zwei Benutzer befreundet ist so wird die kleinere "userid" in user1 und die größere userid in der spalte user2 gespeichert.


    Um herauszufinden welche Benutzer mit einem benutzer befreundet sind habe ich diesen SQL query:

    SQL
    1. SELECT IF(friends.user1 = '". $_parameter ."',friends.user2, friends.user1) AS userid FROM friends WHERE (friends.user1 = ". $_parameter ." OR friends.user2 = ". $_parameter.");";


    $_parameter ist die userid die der PHP Funktion übergeben wird.


    Kommt jemand auf den Code den man benötigt um die Benutzer zu finden die NICHT mit einem gegebenen Benutzer befreundet sind? Also all jene die keine Beziehung zu ihm haben und diejeningen die generell keine Freunde haben.

  • Mir fällt grade nur ein wie du suchen könntest wenn jemand keine freunde hat.
    Einfach in der Tabelle friends bei user1 & user2 nach der UserID suchen.
    Sofern die schonmal nicht vorhanden ist hat er 0Freunde.


    Könnte man nicht einfach zählen wie viele UserID es gibt dann vergleichen.
    Kleines bsp:
    Es gibt 5 UserID's
    UserID 1 ist freund mit UserID 2 + 4
    UserID 2 ist freund mit UserID 1 + 3
    UserID 5 hat 0 freunde


    Der query für UserID5 suchen ob er freunde hat:

    Code
    1. $auslesen = mssql_query("select * from friends where user1='$UserID'");
    2. $auslesen = mssql_query("select * from friends where user2='$UserID'");


    Da man weiß wie viele UserID's es gibt, kann man da nicht eine abfrage machen z.B:
    UserID 1 ist freund mit UserID 2 +4 , aber nicht mit UserID 3 + 5


    Ich weiß jetzt grade nicht wie du das dann haben möchtest...
    Eine ausgabe wer mit wem nicht befreundet ist ?

  • Es geht darum einem Benutzer andere Benutzer anzuzeigen die er noch nicht kennt. In PHP ist das natürlich ein Kinderspiel, ich brauche es auf Grund der großen Datenmengen jedoch als SQL Kommando.


    Hier ein Beispiel:
    trigger ist befreundet mit awesome
    awesome ist befreundet mit hangman
    ger_brian hat keine Freunde


    => trigger ist nicht befreundet mit: hangman und ger_brian


    Hört sich viel einfach er an als es ist oder?^^

  • Aber du musst wissen das dein Bsp falsch ist.
    Wenn trigger Freund mit awesome ist.
    Awesome mit hangman und trigger !



    Sent from my iPod touch using Tapatalk.

  • Das Beispiel ist nicht falsch, hangman ist kein Freund von trigger sondern nur ein Freund zweiten Grades.


    Awesome ist befreundet mit trigger und hangman, jedoch nicht mit ger_brian, da mit ger_brian niemand befreundet ist (Ähnlichkeiten mit lebenden oder verstorbenen Personen sind rein zufällig).


    Ein teil des querys dürfte so aussehen:


    SQL
    1. SELECT
    2. u.id, u.username
    3. FROM
    4. user u
    5. LEFT JOIN
    6. friend f ON ( u.id IN (f.user1_id, f.user2_id) )
    7. WHERE
    8. f.id IS NULL
  • SQL
    1. SELECT userid
    2. FROM users
    3. LEFT JOIN friends
    4. ON (users.userid IN (friends.user1, friends.user2)) AND $_parameter IN (friends.user1, friends.user2)
    5. WHERE friends.friendsid IS NULL AND users.userid != $_parameter;


    Sieht hier jemand einen Fehler? Das resultat ist nämlich immer leer...

  • Sorry, dass es so lange gedauert hat (aber andererseits hat wahrscheinlich auch keiner nen Post von mir erwartet ^^), aber nach stundenlangem Zerbrechen des Kopfes ist mir jetzt endlich eingefallen, wie man da vorgehn muss.


    Und zwar musst du zuerst herausfinden, wer mit dem entsprechenden User befreundet ist. Das ist ja auch kein Thema. Und das Ergebnis zieht man von der Gesamtmenge zusammen mit dem User selbst ab (man selbst ist zwar kein Freund von sich selbst, aber will man ja trotzdem nich drin haben). Dann hat man eigentlich die Differenz, welche keine Freundschaft zum User hat.


    Das Ergebnis sieht so aus:

    SQL
    1. select users.name from users where users.id not in (select if_f.user2 from users if_u join friends if_f on if_u.id in (if_f.user1, if_f.user2) where if_u.id = $userid) and users.id <> $userid


    $userid ist dabei eine Variable und if_ steht für is friend, damit man die gelieferten Ergebnisse von einander trennen kann (nicht dass man da nachher noch was vertauscht ;)).

  • :clapping:
    Habs zwar inzwischen schon mit PHP gelöst (genau so wie du), aber ich werde dein SQL Statement einpflegen. Vielen Dank!