1

テーブル ユーザーのデータベースには、次の 3 つの列があります。

id
name
friends

列の友達には、列名に名前が格納されている人と友達になっている人の名前です。列の友達は次のようになります。

friendname1,friendname2,friendname3,friendname4

それらの友人のそれぞれには、名前が自分の名前と等しい独自の行があります。

また、4 つの列がある post という別のテーブルもあります。

id
name_posted
post
visible

私が今欲しいのは、 name_posted がログインしたユーザーの名前またはテーブル user の列の友達に保存されている彼の友達の名前と等しいテーブル post からすべての投稿を選択することです。

ログインしたユーザーの名前は、変数 $user に格納されます。

ログインしたユーザーからの投稿のみを選択するには、これを使用できます。

$all_posts = mysqli_query($connect_db, "SELECT * FROM post WHERE name_posted='$user' AND visible='yes'");

しかし、彼の友達からの投稿も選択するために含める方法がわかりません。ログインすると、Facebook のようなものがあり、自分の投稿と友達の投稿が表示されます。彼らがどのようにそれを作成したかはわかりません。長い投稿で申し訳ありませんが、詳細な説明をしたかっただけです。

4

5 に答える 5

2

複数のテーブルにまたがる情報に基づいてデータを選択するには、MySQL Joinsを読むことをお勧めします。

于 2013-04-26T16:35:12.400 に答える
1

おそらく2つのクエリで、最初に次のように友達を選択します:

SELECT * FROM user WHERE name='$user' 

私が正しく理解していれば、彼のすべての友達が次のように文字列になっています。

friend1,friend2,friend3...

$row['friends'] を爆発させます -> expand(',',$row['friends']); すべての友達の名前を配列で取得してから、foreachループで別の選択を実行して、友達からすべての投稿を取得し、好きな方法で表示するか 、クエリでINを実行することをお勧めします

select * from posts where name_posted IN ($row['friends'])

これは逆の方法で、より長くなります

foreach($friendarray as $k=>$friend){
    ...
      mysqli_query($connect_db,
          "SELECT * from post where name_posted='$friend' AND visible='yes'");
    ...
}

また、独自の投稿を取得するために既に必要なクエリもあります。すべての値やものをエスケープすることを忘れないでください...

2つのテーブルを結合することもできますが、そのクエリを心から書くことはできません.座って実際のデータで試してみる必要がありますが、それはあなたにとって究極の解決策です.

うまく打てたかどうかわからないけど助けが必要なら叫ぶ

于 2013-04-26T16:45:24.060 に答える
0

おそらく、DB の設計を再検討する必要があります。あなたが説明したことから、userinfo、friendship、posts の 3 つのテーブルが必要です。

そうすれば、3 つのテーブルすべてを簡単に結合して、探しているものを 1 つのクエリで取得できます。

于 2013-04-26T19:07:51.553 に答える
0

次のような単一のクエリで実行できます。

SELECT p.* 
FROM user u 
join post p 
  on (u.name = p.name or concat(',',u.friends,',') like concat('%,',p.name,',%') 
     AND p.visible='yes' 
WHERE u.name='$user' 

- ただし、ユーザーとその友人との関係を適切に正規化した設計を使用した場合よりも、パフォーマンスが大幅に低下する可能性があります。

于 2013-04-26T17:39:10.293 に答える