2017-03-07 1 views
0

ich zwei Tabellen haben, Benutzer und Verbindungen, und sie haben diese Spalten:PostgreSQL: Freunde von Freunden, aber meine Beziehung zu diesen Freunden

CREATE TABLE users (
    id serial PRIMARY KEY, 
    name text 
); 

CREATE TABLE connections (
    from_id int REFERENCES users (id) ON DELETE CASCADE, 
    to_id int REFERENCES users (id) ON DELETE CASCADE, 
    status connection_status, 
    PRIMARY KEY (from_id, to_id), 
    UNIQUE (from_id, to_id) 
); 

Und ich diese Art auch haben:

CREATE TYPE connections_status AS ENUM ('accepted', 'pending'); 

Die Verbindungstabelle wird eine Zeile für jede Verbindung enthalten, so dass, wenn user1 eine Verbindung mit benutzer2 hat, wird es eine Zeile, aber das bedeutet nicht, dass user2 eine Verbindung mit user1 hat. Sehen Sie es wie Instagram oder Twitter, wo Sie Follower haben und Leute verfolgen. Wenn also eine Zeile in der Datenbank mit Benutzer1 als von_id und Benutzer2 als to_id ist, bedeutet das, dass Benutzer1 Benutzer2 folgt.

Frage

Ich mag würde einen Benutzer Verbindungen bekommen, und meine Beziehungen zu seinen Verbindungen in einer Abfrage. Angenommen, ich bin user1 und möchte alle Verbindungen (akzeptierte und ausstehende Follower und Follower) für user2 und meine Verbindungen zu den Verbindungen von user2 finden, die entweder akzeptiert, ausstehend oder null sein können.

Antwort

0

siehe beigefügte Abfrage trat i Verbindungen zweimal mit Benutzern 1. users.id mit connection.from_id, das alle Nutzer bringen kommt die user1 mit dem folgenden Status wird wie folgt 2. users.id mit connection.to_id , dieser Join bringt alle Benutzer, die auf Benutzer1 folgen, mit dem Status.

sehr impotent: Wenn Benutzer1 mehr als eine Verbindung haben, werden Sie die Zeile für jede Kombination neu beleben.

, wenn Sie eine Zeile wie für jeden Benutzer erhalten Sie Windows-Funktionen verwenden können, führen und hinken

select user.id as user, 
     user.name, 
     following.from_id as user_following, 
     following.status as status_following, 
     followees.from_id as user_followees, 
     followees.status as status_followees 
from users 
left join connections following on users.id=following .from_id 
left join connections followees on users.id=followees.from_id 
Verwandte Themen