2015-11-19 3 views
8

मैं अपने ऐप के भीतर जुड़े हुए फोन नंबरों को अलग-अलग छः डिग्री तक दिखाने के लिए डी 3.जेएस का उपयोग करके नेटवर्क विश्लेषण का निर्माण कर रहा हूं। शुरुआती कनेक्शन खोजने के लिए एसक्यूएल (पोस्टग्रेस) नीचे और काफी सरल है। हालांकि, मैं कनेक्शन के छह स्तरों के माध्यम से आगे बढ़ने के लिए इसे संशोधित करने के तरीके पर फंस गया हूं, फिर रुकें।एसक्यूएल क्वेरी नेटवर्क विश्लेषण के लिए पृथक्करण के 6 डिग्री

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); 

मैं पाया है इस समस्या में अनुसंधान के माध्यम से की आम टेबल भाव (CTE) और प्रत्यावर्तन का उल्लेख है, लेकिन अनिश्चित कैसे उन्हें यहाँ लागू करने के लिए कर रहा हूँ।

मेरा लक्ष्य है कि मैं एक सामान्य फोन हैश के माध्यम से शुरुआती खिलाड़ी ($ 1) से जुड़े सभी खिलाड़ियों को प्राप्त करना चाहता हूं, फिर सभी खिलाड़ियों को एक सामान्य फोन हैश के माध्यम से उन सभी कनेक्शन से कनेक्ट किया जाता है, और आगे अलगाव के 6 डिग्री तक।

+7

अपने प्रश्न को संपादित करें और परिभाषा जोड़ें (तालिका बनाओ ') शामिल तालिकाओं का। –

+0

इसके अलावा, यह अक्सर प्रश्न को समझने में मदद करता है यदि प्रश्न में एक उदाहरण शामिल है - डेटा की कुछ पंक्तियां और क्वेरी का परिणाम इस नमूना डेटा पर आधारित होना चाहिए। –

+0

ए ** टेबल परिभाषा ** वह है जिसे आप psql में '\ d game.phone_hashes' के साथ प्राप्त करते हैं। या पूर्ण 'तालिका बनाएं' स्क्रिप्ट। –

उत्तर

7

मुझे लगता है कि यह आप क्या मतलब है:

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

सोचो यह होगा:

-- 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)))))); 

कृपया नीचे कामकाज देखें:

-- 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)))))); 
संबंधित मुद्दे