Nasıl MySQL ve PHP kullanarak arkadaş arkadaşlarım olsun zorundadır

6 Cevap php

Şu anda ben PHP ve MySQL kullanarak benim uygulamada arkadaş arkadaş bulmak için ihtiyacı duyuyorum

Örneğin: Veritabanı yapısı böyledir. Tablo Adı: tbl_friendlist

Ident   mem_id  friend_id
1         2        1
2         1        2
3         1        3
1         4        1
5         1        8

Nasıl elde edebilirsiniz

Ben tarafından Arkadaşlar almak mümkün

SELECT * FROM tbl_friendlist WHERE mem_id = 1.

Bu kullanarak benim arkadaşlarım listesini almak mümkün duyuyorum. Şimdi nasıl i friends of friends alabilirsiniz

6 Cevap

i de bir alt sorgu yapardı (benim SQL gerçekten paslı, ancak sorgu böyle bir şey görünecektir)

SELECT * from tbl_friendlist where mem_id in (SELECT friend_id FROM tbl_friendlist WHERE mem_id = 1).

Yani, adımlar girmesini - tüm arkadaş bulmak istiyorum, ve sonra tüm arkadaşlarına bulmak istiyorum. Bu iki Sorgunuz parçaları (ve alt sorgu) şunlardır:

Bu, tüm arkadaşlarınızın bir listesini almak istiyorum nasıl

SELECT friend_id
FROM tbl_friendlist
WHERE f.mem_id = 1

Ve sonra sadece ikinci bölümünde bu sarın:

SELECT f.friend_id
FROM tbl_friendlist f
WHERE f.mem_id IN (
    SELECT f2.friend_id
    FROM tbl_friendlist f2
    WHERE f2.mem_id = 1
)

Ayrıca, örneğin, orada bazı ekstra filtreler eklemek isteyebilirsiniz:

SELECT DISTINCT f.friend_id
FROM tbl_friendlist f
WHERE f.mem_id IN (
    SELECT f2.friend_id
    FROM tbl_friendlist f2
    WHERE f2.mem_id = 1
) AND f.friend_id <> 1

Bu çoğaltmaları almazsınız, ve arkadaşlarınızın arkadaş listenizde kendinizi bulmak anlamına gelir.

Tarafından çözüm nickf çalışacaktır, ama ben şahsen bir JOIN Bu yapardım:

SELECT
    DISTINCT fof.friend_id
FROM
    tbl_friendlist f
    JOIN tbl_friendlist fof ON fof.mem_id=f.friend_id
WHERE
    f.mem_id = 1 AND fof.friend_id != 1;

Eğer sorgular olmadan bir yol bulmak için gerekiyorsa kendisi ON tablo katılarak bunu deneyebilirsiniz.

Fikir, denenmemiş:

SELECT a.mem_id, b.mem_id AS secundaryfriends FROM tbl_friendlist AS a
JOIN tbl_friendlist AS b ON a.friend_id = mem_id;

Hmm, ben böyle bir şey işe düşünüyorum:

SELECT 
   f1.friend_id, group_concat( f2.friend_id ) as f_of_f
FROM 
   tbl_friendlist f1
   LEFT JOIN 
   tbl_friendlist f2 ON ( f1.friend_id = f2.mem_id )
WHERE 
   f1.mem_id = 1
GROUP BY 
   f2.mem_id

Bu f_of_f sütununda bir virgül ayrı bir değer olarak size arkadaş arkadaş kimlikleri verecektir.

ve arkadaş arkadaş arkadaş:

SELECT
    DISTINCT fof.friend_id
FROM
    tbl_friendlist f
    JOIN tbl_friendlist fof ON fof.mem_id=f.friend_id
    JOIN tbl_friendlist fofof ON fofof.mem_id=fof.friend_id
WHERE
    f.mem_id = 1 AND fof.friend_id != 1;

Bu doğru mu?