2

メッセージ、ユーザー、友達の 3 つのテーブルがあります。

Messages: msg_id, uid_fk, message, alert, created, uploads, owner
Users: uid, first_name, last_name
Friends: friend_one, friend_one

ユーザーが別のユーザーと友達になると、次の方法でそのユーザーの uid を記録します。friend_one: 58 friend_two: 172 以下のコードは完全に機能し、ユーザーのすべてのメッセージ更新を選択します。私の問題は、ユーザー自身だけでなく、友人のメッセージもすべて選択する必要があることです。

上記のように、以下はユーザーのステータス更新のみを選択します。ユーザーのステータス更新だけでなく、それを使用している友人も選択するのに何時間も苦労しています。

$query = $db->prepare("SELECT M.msg_id, M.uid_fk, M.message, M.alert, 
M.created, M.uploads , M.owner , U.uid , U.first_name , U.last_name FROM 
messages M, users U  WHERE M.uid_fk=U.uid and M.uid_fk= :uid_fk limit 10");
$query->execute(array(':uid_fk' => $uid));

($uid はログインしているユーザーのセッション ID です)

また、念のために友達を選択するための私のコード:

$friends_sql = $db->prepare("SELECT a.first_name, a.uid, a.last_name FROM users 
a, friends b WHERE a.uid = b.friend_two AND b.friend_one = :friend_one ORDER BY 
b.friend_id DESC LIMIT 8");
$friends_sql->execute(array(':friend_one' => $uid));
4

2 に答える 2

3

以下は、ユーザーとユーザーの友達への最新の10個のメッセージを返すはずです。

SELECT 
    M.msg_id, 
    M.uid_fk, 
    M.message, 
    M.alert, 
    M.created, 
    M.uploads, 
    M.owner, 
    U.uid, 
    U.first_name, 
    U.last_name 
FROM 
    users u 
    JOIN messages m ON m.uid_fk = u.uid
WHERE
    u.uid = :uid
    OR u.uid IN (
        SELECT f.friend_two
        FROM friends f
        WHERE f.friend_one = :uid
    )
ORDER BY m.created DESC
LIMIT 10
于 2012-07-25T17:16:36.150 に答える
0

ステータス更新を選択するための SQL クエリは、ユーザー ID が指定された単一の値 (つまり、ユーザーのユーザー ID の値) であるすべての更新を検索します。

代わりに、ユーザー ID の LIST ですべての更新を探すように依頼します。

$query = $db->prepare("SELECT M.msg_id, M.uid_fk, M.message, M.alert, 
M.created, M.uploads , M.owner , U.uid , U.first_name , U.last_name FROM 
messages M, users U  WHERE M.uid_fk=U.uid and (M.uid_fk IN ( 
    SELECT friend_two FROM friends WHERE friend_one = :uid_fk
) OR M.uid_fk = :uid_fk ) limit 10");
$query->execute(array(':uid_fk' => $uid));

また...

$query = $db->prepare("SELECT M.msg_id, M.uid_fk, M.message, M.alert, 
M.created, M.uploads , M.owner , U.uid , U.first_name , U.last_name FROM 
messages M, users U  WHERE M.uid_fk=U.uid and M.uid_fk IN ( 
    (SELECT :uid_fk) UNION 
    (SELECT friend_two FROM friends WHERE friend_one = :uid_fk)
) limit 10");
$query->execute(array(':uid_fk' => $uid));
于 2012-07-25T17:07:52.750 に答える