我有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:172 friend_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));
答案 0 :(得分: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
答案 1 :(得分: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));