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:172friend_two:58 | 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 列表中查找所有更新:

$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 回答