Birden YA adlı bir alternatif olarak katılmak

2 Cevap php

Aşağıdaki yapıya sahip iki tablo vardır:

table name: friends
uid (PK)(FK)
friend_id (PK)(FK)

table name: posts
post_id (AI)(PK)
post_text
uid (FK) //poster id

I'd like to select posts that were only made from friends of user x. My inital plan was to use the following code:


SELECT posts.post_text INNER JOIN friends ON posts.uid = friends.friend_id 
WHERE friends.uid = x

Ancak, bu işe görünmüyor. . Olarak - (I friends X adlı tarafından yapılan tüm mesajlarını yapılır, x tarafından yapılan tüm mesajları almak aklıma tek alternatif YA adlı bir (muhtemelen çok uzun) bir dize kullanmak için

WHERE posts.uid = 'friend_id_1' OR posts.uid = 'friend_id_2' ect..

Any alternative solutions? Thanks.

2 Cevap

SELECT  posts.*
FROM    friends
JOIN    posts
ON      posts.uid = friends.friend_id
WHERE   friends.uid = 'x'

Eğer verilerinizi daha iyi kontrol bu sorgu, çalışması gerekir.

Zaman zaman X kendi arkadaş yapmak değil mi?

Eğer dostluk ilişkisi symmetrical, i ise. e. X Y, sonra da Y X bir arkadaşım için bir arkadaşı ise, o zaman bu gibi tablo yapmak gerekir:

friends (a, b, PRIMARY KEY (a, b), KEY (b))

SELECT  posts.*
FROM    (
        SELECT  b AS friend_id
        FROM    friends
        WHERE   a = 'X'
        UNION ALL
        SELECT  a AS friend_id
        FROM    friends
        WHERE   b = 'X'
        ) friends
JOIN    posts
ON      posts.uid = friends.friend_id

Böylece A < B arkadaşlar bir çift takmadan önce, her zaman i, düzenlemek. e. en ile kullanıcı user_id A geçer.

Bu sizin için ne arıyorsanız olduğunu düşünüyorum

SELECT posts.post_text INNER JOIN friends ON posts.uid = friends.friend_id 
Inner join friends fr on friends.friend_id = fr.uid
WHERE friends.uid = x