2011-05-13 7 views
1

アイテムがstatus = 1とマークされている場合、誰にでも表示されるアイテムのリスト アイテムが追加されると、それらのステータスは0にもなります。つまり、あなたがアイテムを送信したユーザーと友人でない限り、すべての人には見えません。友情のユーザーIDのペアは、別のテーブルに格納されます。php/mysqlの他の人に隠されている友人のアイテムのリストを表示する最も良い方法

フレンドテーブルは、friends_inviter、friends_accepter、friends_status(friends_status = 1の場合は友人)の3列です。友人関係を開始するユーザ(ID)は招待者であり、友人関係を受け入れるのは手掛かりである。友人のIDはどちらの列にも表示されます。

(この例の場合)項目テーブルも3列があります。ITEM_ID、item_status、item_owner

最高 リストのステータス= 1つの項目のを表示する方法だけでなく、状況がどうなるか

= 0あなたの友人リストに表示されているユーザーのアイテム。

答えて

0

私の提案です:

SET @userID = 1; 

SELECT i.* 
FROM items i 
WHERE i.status = 1 
OR (
     i.status=0 
     AND 
     i.user_id IN ( 
      SELECT f.inviter_id FROM friends f WHERE f.accepter_id = @userID AND f.status = 1 
      UNION 
      SELECT f.accepter_id FROM friends f WHERE f.inviter_id = @userID AND f.status = 1 
     ) 
) 

[+]私はあなたの編集を気づいていません、しかしこれには、あなたのアイテムのテーブルにも、このアイテムを追加した人物を区別するカラムが必要です。

+0

これはうまくいくようです。各テーブルの100万以上の行でスケーリングします。 –

+0

副SELECTで 'SELECT SQL_CACHE ...'を試してみるか、別のクエリに移動して配列を得るために最初に実行してください。この配列を 'IN()'の引数を得るためには、 –

0

各アイテムにアイテムを投稿したユーザーの外部キーがあるように、テーブルに関するいくつかの前提がありました。あなたがアイテムテーブルのための構造を与えていない

select i.* from friends f 
join items i on 
    (i.user_id = f.friends_inviter XOR i.user_id = f.friends_accepter) 
where f.friends_status = 1 
    and i.user_id != $current_user_id 
0

ので、これは推測

SELECT * FROM item i 
LEFT JOIN friends f ON f.friends_status = 1 AND f.friends_inviter = i.userid 
WHERE i.status = 1 OR f.friends_status IS NOT NULL` 
関連する問題