0

一部のデータの取得に問題があります....誰かが私を助けることができるかどうか疑問に思っていました.

4 つのテーブルがあります (いいね、フォロー、コメント、ユーザー)

ユーザーがいいね/コメント/フォロー/etc... (ユーザーが特定のユーザーをフォローしている場合) のときに、自分のページにデータを入力できるようにしたいと考えています。

好き

idlikes   idusers    iditem
  1          1          5
  2          2          4
  3          2          22

従う

idfollow   idusers_follower   idusers    idbusiness
  1              1               2           
  2              1               3           
  3              1               4           
  4              4               2           
  5              4                           1

コメント

idcomments   idusers    text
   1            1       asfd
   2            2       safd

ユーザー

idusers
   1
   2
   3
   4

たとえば、ID ユーザー #1 の場合、ユーザー #2、#3、#4 をフォローしています

私のページには次のように表示されます。

  • #2 は項目 #4、#22 が好きです。
  • #4 は #2 をフォローしています (私は #4 をフォローしているため、これが表示されます)
  • #2 件のコメント

これを表示する最良の方法がわかりませんか?現在、一度に複数の関数がテーブルに対してクエリを実行しており、配列をマージする作業を行っていますか? または、結合テーブルを使用する必要がありますか? 私が今しようとしているのは...

私がフォローしているユーザーを取得します。

$feeds = new feed();
$meID = 1;
$query = "SELECT idusers FROM follow WHERE iduserse_follower = ?";

$users = $dbh -> prepare($query);
$users -> execute(array($meID));

while($following = $users -> fetch(PDO::FETCH_ASSOC)){
      $follow = $following['idusers']; //This will get all of useres I'm following
      $populate = $feeds->feed_all($follow); // from function
}

クエリ

class feed()
{
     public function feed_all($idusers)
     {
         // SYNTAX HELP //////////////////////
           $query = "SELECT 
           f.idusers_follower, 
           f.idusers, 
           l.iditem, 
           c.text 
           FROM follow f, users u 
           JOIN likes l 
           ON l.idusers = f.idusers 
           JOIN comment c
           ON c.idusers = f.idusers
           WHERE f.idusers_follower = ? AND f.idusers_follower = l.idusers AND f.idusers_follower = c.idusers AND f.idusers = u.idusers"

           $pop = $dbh->prepare($query);
           $pop ->execute($idusers);

           // while loop to return value
    while($row = $pop -> fetch(PDO::FETCH_ASSOC))
    {
        $feed_data[]=$row;
    }
    return $feed_data;
     }
}

これは私が立ち往生しているところです。:( ステートメントを正しく行っているかどうかさえわかりませんか?

++++++++++ 編集: ++++++++++++

idbusinessを追加するために編集しました

私は #4 をフォローしているので、#4 が #1 をフォローしていることも示されます。

4

1 に答える 1

4

3つの別々のクエリを実行する現在のアプローチは、他のどのアプローチよりも優れています。を使用して、それらを単一の結果セットに結合できますUNION。これは、結合された結果をフィールド(アクティビティのタイムスタンプなど)で並べ替えたり、結合された結果を制限したりする場合に便利です。

  SELECT idusers, 'likes' AS what, likes.iditem AS detail
  FROM   likes JOIN follow USING (idusers)
  WHERE  follow.idusers_follower = 1

UNION ALL

  SELECT f1.idusers, 'follows', f2.idusers
  FROM   follow f1 JOIN follow f2 ON f1.idusers = f2.idusers_follower
  WHERE  f1.idusers_follower = 1

UNION ALL

  SELECT idusers, 'commented', comment.text
  FROM   comment JOIN follow USING (idusers)
  WHERE  follow.idusers_follower = 1

sqlfiddleでそれを参照してください。

于 2012-09-03T22:14:21.180 に答える