

SQLiteとPHPを用いたSNSで、メッセージを送れる相手を両思い(お互いがお互いをフォローしている)のユーザーに限りたいのですが、  
自分が:idのIDだとして、自分と両思いしているユーザー(ID)一覧を取得するにはどのようなSQL文を発行すればいいのでしょうか?  
followテーブルは以下のようになっています。  
from_id:フォローしたユーザーID  
to_id:フォローされたユーザーID


CC BY-SA 3.0
2015-01-20T03:32:54.643
4882
2015-02-14T23:14:06.543
question
php sqlite pdo
SQLiteとPHPを用いたSNSで、両思いのユーザーを取得したい


自分のIDが1だった場合で、followテーブルの中身を以下のように仮定してみます。

[code]

    from_id | to_id
    --------+--------
    1       | 10
    1       | 11
    1       | 12
    2       | 1
    11      | 1
    12      | 1
    12      | 2
    12      | 11
    
[/code]

この場合、自分がフォローしているユーザーが 10, 11, 12 の3人。また、自分をフォローしているユーザーが 2, 11, 12 の 3人となります。

両思いのユーザーを見つけるには、以下の様にfollowテーブル同士で結合して（一つは自分がフォローしている人のリスト(following)、もう一つは自分をフォローしている人のリスト(follower)）、その
following.to_id と follower.from_id、following.from_id と follower.to_id
がそれぞれ一致すれば両思いのユーザーとして取得出来るかと思います。

[code]

    SELECT
      following.to_id
    FROM follow following
      INNER JOIN follow follower
        ON following.to_id = follower.from_id AND following.from_id = follower.to_id
    WHERE following.from_id = :id
    
[/code]


CC BY-SA 3.0
2015-01-20T03:58:07.437
4883
2015-01-20T03:58:07.437
2944
4882
answer


副問い合わせはどうでしょう？  
from_idが１の集合を作り、その中にto_idも１のものとアンドを取るというやりかたです。

[code]

    <?php
    $pdo = new PDO('sqlite:test.db');
    $pdo->query("CREATE TABLE follow(from_id,to_id)");
    $pdo->query("INSERT INTO follow VALUES(1,2)");
    $pdo->query("INSERT INTO follow VALUES(1,3)");
    $pdo->query("INSERT INTO follow VALUES(2,1)");
    $pdo->query("INSERT INTO follow VALUES(3,1)");
    $pdo->query("INSERT INTO follow VALUES(3,2)");
    $sql = "SELECT from_id FROM follow WHERE from_id IN (SELECT to_id FROM follow WHERE from_id=:id) AND to_id=:id";
    $stmt = $pdo->prepare($sql);
    $stmt->bindValue(':id',2,SQLITE3_INTEGER);
    $stmt->execute();
    while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
        var_dump($result);
        echo "<br>";
    }
    $pdo->query("DROP TABLE follow");
    
[/code]


CC BY-SA 3.0
2015-02-14T15:01:37.830
6490
2015-02-14T15:01:37.830
8278
4882
answer


これ普通に自己結合すればいいのではないでしょうか。  
自己結合もしくは再帰結合で検索すればあまりにも多い結果が出るのでとりあえず参考リンクは貼りません。  
質問の具体的なSQLとしては以下になるかと思うのですが、これだと不都合があるのでしょうか。

[code]

    SELECT following.from_id, following.to_id
      FROM follow following, follow followed
        WHERE
          following.to_id = followed.from_id 
        AND
          followed.to_id = following.from_id
      ;
    
[/code]


CC BY-SA 3.0
2015-02-14T23:14:06.543
6499
2015-02-14T23:14:06.543
8136
4882
answer