我不确定这是否可能,或者我的JOIN-fu是不是足够强大(告诉你真相很懦弱)。我有3个表与UID绑在一起。我试图将所有结果中的信息都收集到一个查询中,除非我无法确保结果符合我的要求。
用户
========= USERS ========== | uid | nickname | -------------------------- | testusr1 | Test User 1 | | testusr2 | Test User 2 | | testusr3 | Test User 3 | | testusr4 | Test User 4 | ============= GALLERY =========== | id | uid | ext | profile | --------------------------------- | 1 | testusr1 | png | 1 | | 2 | testusr2 | jpg | 1 | | 3 | testusr3 | png | 1 | | 4 | testusr4 | png | 1 | | 5 | testusr4 | jpg | 0 | ============= FRIENDS ============= | sender | reciever | status | ----------------------------------- | testusr1 | testusr3 | 0 | | testusr2 | testusr3 | 1 | | testusr2 | testusr1 | 1 | | testusr3 | testusr4 | 1 |
我想要做的就是吸引所有用户的朋友。朋友在状态= 1的朋友表中.uid可以是发件人或收件人。在上表中,testusr3的朋友是:testusr2和testusr4
从这里开始,我想从用户那里获取昵称,并从画廊WHERE profile = 1 AND uid =(该朋友的ID)中获取id。
到目前为止,我的查询如下:
$query = "SELECT u.uid AS USERID, g.id, g.ext, f.sender, f.reciever
FROM friends f
LEFT JOIN gallery g ON g.uid = f.sender AND g.profile = 1
LEFT JOIN users u ON u.uid = f.sender
WHERE f.status = 1
AND (f.sender = '$sentuid' OR f.reciever = '$sentuid')";
但是,它将所有结果标记为f.sender ...而且我非常确定g.profile = 1不起作用。它确实准确地抓住了朋友。任何帮助将不胜感激。
答案 0 :(得分:1)
最佳起点是使用UNION
将匹配记录放在一列中。然后,您可以在一个地方拥有所需的所有UID。
SELECT f.uid, u.nickname, g.id
FROM
(
(SELECT reciever as uid FROM friends where status=1 and sender='$sentuid')
UNION
(SELECT sender as uid FROM friends where status=1 and reciever='$sentuid')
) f
LEFT JOIN gallery g ON f.uid = g.uid and profile=1
LEFT Join users u ON f.uid = u.uid
答案 1 :(得分:0)
我觉得你真的很亲近,但是一个SQLfiddle会有所帮助。我相信你是对的,g.profile = 1
不起作用,因为你没有表格参考,不妨把它拿出来。但是由于加入,你应该可以选择它。
$query = "SELECT u.uid AS USERID, g.id, g.ext, g.profile, f.sender, f.reciever
FROM friends f
LEFT JOIN gallery g ON g.uid = f.sender
RIGHT JOIN users u ON u.uid = f.sender
WHERE f.status = 1
AND (f.sender = '$sentuid' OR f.reciever = '$sentuid')";