1

私はあなたが誰かをフォローしたり、彼らと友達になったりできるソーシャルネットワークを作成しています。表示できるデータは、ユーザーとの関係の種類によって異なります。現在、2つのテーブルを使用できます。投稿と関係。

投稿:

| user_id | post_id | story |
-----------------------------
|  1      |  1      | text. |
-----------------------------

関係:

| rel_id  | user_1  | user_2| status |
--------------------------------------
|  1      |  1      |   2   |    3   |
--------------------------------------

ユーザーテーブルもありますが、ここでは重要ではないと思います。つまり、基本的には、友達やフォローしているユーザーからの投稿をすべて選択したいと思います。User_2は常に関係の受信者です。数字の1、2、3は、関係の「ステータス」を表します。1は受信者をフォローしている、3は友達、4は受信者をフォローしている(唯一の違いは、保留中の友達リクエストもあることです)。SELECT QUERYを設定しましたが、正しく機能していません。

$query=" SELECT * FROM posts LEFT JOIN relationships ON (posts.user_id=    
relationships.user_2 AND relationships.user_1 = $user_id AND relationships.status = 4 
OR 3 OR 1)";

これまでにすべての投稿を2回選択します。何故ですか?投稿を投稿しているユーザーが私と関係があり、ステータスが1、3、または4の投稿のみを選択したいのですが、何が間違っているのでしょうか。これを行う他の方法は何ですか?

前もって感謝します!

4

2 に答える 2

3

それはどのようにOR機能するかではありません。おそらく試してみてくださいIN

... relationships.status IN (4, 3, 1) ...

複製に関しては、 を使用しますDISTINCT

于 2012-08-12T04:30:13.250 に答える
0

OR句条件のWHERE構文が正しくありません。このようなことを試してください:

SELECT  * 
FROM    posts a 
            LEFT JOIN relationships b
                ON a.user_id = b.user_2 
WHERE   b.user_1 = $user_id AND 
        b.status IN (1,3,4)

PDOまたはMYSQLi拡張機能を使用することをお勧めします。

PDO では、次のようになります。

<?php
$stmt = $dbh->prepare("SELECT   * 
                      FROM  posts a 
                           LEFT JOIN relationships b
                                ON a.user_id = b.user_2 
                     WHERE  b.user_1 = ? AND 
                            b.status IN (1,3,4)");

$stmt->bindParam(1, $user_id);
$stmt->execute();

?>

特にデータベースのクエリに使用される入力を常にフィルタリングすることを忘れないでください。

于 2012-08-12T04:34:17.450 に答える