如何正确查询我的朋友 table 与 MySQL 的多对多关系?
How to correctly query my friend table with its many to many relationship with MySQL?
我正在构建一个使用 MySQL 作为数据库的简单应用程序。我有一个用户 table,其信息各不相同,但我也有一个朋友 table。每个用户都有自己的 ID,在发起请求时会在好友 table 中引用。
我的朋友table很简单:
id int NO PRI auto_increment
date datetime NO CURRENT_TIMESTAMP DEFAULT_GENERATED
user_one_id int NO
user_two_id int NO
request_status tinyint NO
我的问题是在尝试查询我的 table 以查找特定用户的朋友时。我在下面的查询中的两个子查询都可以自己正常工作,但是当我将它们包含在主查询中时,我没有得到任何结果。没有错误,但也没有结果。
如果登录用户的ID是1,那么-
SELECT id, display_name, join_date, profile_image_url
FROM user WHERE id IN
(SELECT user_one_id FROM friend WHERE user_two_id = 1 AND request_status = 1)
AND id IN
(SELECT user_two_id FROM friend WHERE user_one_id = 1 AND request_status = 1);
查询应该考虑用户 ID 在任一列中的情况,具体取决于好友请求的实际发起人。
如果这看起来像是一个愚蠢的问题,我深表歉意,但我们都需要学习。
如果有任何其他信息有帮助,请告诉我。
我相信如果您使用 OR 而不是 AND
作为 WHERE
子句中的条件,您的代码将有效,但我提出了一个更简单的解决方案 EXISTS
:
SELECT u.id, u.display_name, u.join_date, u.profile_image_url
FROM user u
WHERE EXISTS (
SELECT *
FROM friend f
WHERE f.request_status = 1
AND (f.user_one_id, f.user_two_id) IN ((u.id, ?), (?, u.id))
);
将 ?
替换为您要搜索的用户的 ID。
我正在构建一个使用 MySQL 作为数据库的简单应用程序。我有一个用户 table,其信息各不相同,但我也有一个朋友 table。每个用户都有自己的 ID,在发起请求时会在好友 table 中引用。
我的朋友table很简单:
id int NO PRI auto_increment
date datetime NO CURRENT_TIMESTAMP DEFAULT_GENERATED
user_one_id int NO
user_two_id int NO
request_status tinyint NO
我的问题是在尝试查询我的 table 以查找特定用户的朋友时。我在下面的查询中的两个子查询都可以自己正常工作,但是当我将它们包含在主查询中时,我没有得到任何结果。没有错误,但也没有结果。
如果登录用户的ID是1,那么-
SELECT id, display_name, join_date, profile_image_url
FROM user WHERE id IN
(SELECT user_one_id FROM friend WHERE user_two_id = 1 AND request_status = 1)
AND id IN
(SELECT user_two_id FROM friend WHERE user_one_id = 1 AND request_status = 1);
查询应该考虑用户 ID 在任一列中的情况,具体取决于好友请求的实际发起人。
如果这看起来像是一个愚蠢的问题,我深表歉意,但我们都需要学习。
如果有任何其他信息有帮助,请告诉我。
我相信如果您使用 OR 而不是 AND
作为 WHERE
子句中的条件,您的代码将有效,但我提出了一个更简单的解决方案 EXISTS
:
SELECT u.id, u.display_name, u.join_date, u.profile_image_url
FROM user u
WHERE EXISTS (
SELECT *
FROM friend f
WHERE f.request_status = 1
AND (f.user_one_id, f.user_two_id) IN ((u.id, ?), (?, u.id))
);
将 ?
替换为您要搜索的用户的 ID。