php - 在查询中连接多个 MySQL 表

标签 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      |

我想做的是获取用户的所有 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/

相关文章:

javascript - 以 Angular 删除 `{{`

php - mysqli, SQL错误: Access denied for user 'user' @'localhost' (using password: YES)

mysql - 与同一实体的多个一对多关系

mysql - 在最后三个字符之前插入空格

java - JDBC 删除数据库中具有特定时间戳的行

未捕获 PHP 异常

javascript - 如何创建一个非常简单的 webhook?

php - 字段中每个值的 MYSQL 计数

MySql Select with auto incrementing column not existing in table

mysql - 如何通过批处理文件中的用户输入在mysql连接中输入用户名,密码,数据库名称