2015-11-19 5 views
8

Buduję analizę sieci za pomocą D3.js, aby wyświetlić połączone numery telefonów w mojej aplikacji do sześciu stopni separacji. SQL (postgres) do znalezienia początkowych połączeń jest poniżej i dość prosty. Jednak jestem zaskoczony, jak to zmienić, aby przejść przez sześć poziomów połączeń, a następnie przestać.Zapytanie SQL 6 stopni separacji dla analizy sieci

SELECT player_id, ps.player_state, ps.email, ph.create_date 
FROM game.phone_hashes ph 
INNER JOIN game.customer_settings cs ON cs.id = ph.player_id 
WHERE hash IN (SELECT hash FROM game.phone_hashes WHERE player_id = $1); 

znalazłem wzmianki o wspólnym stole wyrazu (CTE) i rekursji poprzez badania nad tym problemem, ale jestem pewien, jak zastosować je tutaj.

Celem moich działań jest doprowadzenie wszystkich graczy połączonych do początkowego gracza (1 $) za pośrednictwem zwykłego skrótu telefonicznego, a następnie do wszystkich graczy podłączonych do każdego z tych połączeń za pośrednictwem zwykłego skrótu telefonicznego, i włączania i wyłączania do 6 stopni separacji.

+7

Proszę edytować swoje pytanie i dodać definicję ("Utwórz tabelę") zaangażowanych tabel. –

+0

Ponadto często pomaga zrozumieć pytanie, czy pytanie zawiera przykład - kilka wierszy danych i jaki wynik zapytania powinien być oparty na tych przykładowych danych. –

+0

Definicja tabeli ** ** jest tym, co dostajesz z '\ d game.phone_hashes' w psql. Lub kompletny skrypt 'CREATE TABLE'. –

Odpowiedz

7

myślę, że to jest to, co masz na myśli:

with recursive tc as(
select $1 as player_id, 1 as level 
    union 
select ph2.player_id, level+1 
    from tc, phone_hashes ph1, phone_hashes ph2 
    where tc.player_id=ph1.player_id 
    and ph1.hash=ph2.hash 
    and tc.level < 6 
)  
select distinct player_id from tc 
4

że byłoby:

-- 6 degrees of separation 
SELECT player_id, ps.player_state, ps.email, ph.create_date 
FROM game.phone_hashes ph 
INNER JOIN game.customer_settings cs ON cs.id = ph.player_id 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
     WHERE player_id = $1)))))); 

proszę zobaczyć funkcjonowanie poniżej:

-- 1 degree of separation 
SELECT player_id, ps.player_state, ps.email, ph.create_date 
FROM game.phone_hashes ph 
INNER JOIN game.customer_settings cs ON cs.id = ph.player_id 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes WHERE player_id = $1); 

-- 2 degrees of separation 
SELECT player_id, ps.player_state, ps.email, ph.create_date 
FROM game.phone_hashes ph 
INNER JOIN game.customer_settings cs ON cs.id = ph.player_id 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
    WHERE player_id = $1)); 

-- 3 degrees of separation 
SELECT player_id, ps.player_state, ps.email, ph.create_date 
FROM game.phone_hashes ph 
INNER JOIN game.customer_settings cs ON cs.id = ph.player_id 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE player_id = $1))); 

-- 4 degrees of separation 
SELECT player_id, ps.player_state, ps.email, ph.create_date 
FROM game.phone_hashes ph 
INNER JOIN game.customer_settings cs ON cs.id = ph.player_id 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE player_id = $1)))); 


-- 5 degrees of separation 
SELECT player_id, ps.player_state, ps.email, ph.create_date 
FROM game.phone_hashes ph 
INNER JOIN game.customer_settings cs ON cs.id = ph.player_id 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE player_id = $1))))); 

-- 6 degrees of separation 
SELECT player_id, ps.player_state, ps.email, ph.create_date 
FROM game.phone_hashes ph 
INNER JOIN game.customer_settings cs ON cs.id = ph.player_id 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
WHERE hash IN 
(SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
    WHERE hash IN 
    (SELECT hash FROM game.phone_hashes 
     WHERE player_id = $1))))));