在查询中加入多个MySQL表

时间:2014-12-02 01:26:43

标签: php mysql

我不确定这是否可能,或者我的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不起作用。它确实准确地抓住了朋友。任何帮助将不胜感激。

2 个答案:

答案 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

附注:

  • 使用char作为ID字段通常是个坏主意。
  • 出于性能原因,您可能最好使用更多存储空间,并将“朋友”记录加倍。即:每个友谊的两个条目。

答案 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')";