我不确定这是否可能,或者我的 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 |
我想做的是获取用户的所有 friend 。好友位于好友表中,状态 = 1。uid 可以是发送者,也可以是接收者。上表中,testusr3的好友是:testusr2和testusr4
从这里,我想从用户那里获取昵称,并从图库中获取 ID,其中 profile = 1 AND uid =(该 friend 的 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 不起作用。但它确实准确地捕获了 friend 。任何帮助将不胜感激。
最佳答案
未经测试的解决方案
最好的起点是使用 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
旁注:
- 使用 char 作为 ID 字段通常不是一个好主意。
- 出于性能方面的考虑,您最好实际使用更多存储空间,并将“ friend ”记录加倍。即:每个友谊有两个条目。
关于php - 在查询中连接多个 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27240380/