2012-07-25 55 views
2

我有3个表:消息,用户和朋友。SQL加入声明收集用户的朋友和用户的消息

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

就这么你知道,你可以把回车放在你的'$ db-> prepare'调用的引号内。因此,按照Michael Fredrickson的回答,您可以用可读的方式格式化SQL,这样可以更轻松地关注您和其他看到您代码的人。 – halfer 2012-07-25 17:21:53

+0

噢,那真的会有很大的帮助。谢谢你的提示。 – user1011713 2012-07-25 17:26:11

回答

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 
+0

这样做的工作。再次感谢迈克尔。 – user1011713 2012-07-25 17:29:50

0

选择状态更新你的SQL查询查找所有更新用户标识是给定的单个值(即用户用户标识的值)。

相反,要求其寻找所有更新的用户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)); 
+0

对不起,无法得到这个工作。 – user1011713 2012-07-25 17:29:12