MySQL: 如果用户没有设置免打扰或用户设置了免打扰,布尔查询返回 true 给定的 ID 必须是朋友

MySQL: Boolean query returning true if user has not set dnd or if user has set dnd given ID must be a friend

我有这些简单的表格:

1. USER_DND
╔════════╦══════╗
║ UserID ║ DnD  ║
╠════════╬══════╣
╚════════╩══════╝

2. USER_FRIEND
╔════════╦══════════╗
║ UserID ║ FriendID ║
╠════════╬══════════╣
╚════════╩══════════╝

USER_DND:它包含用户的 ID 和他们的请勿打扰 (Dnd) 标志。 UserID 是整数并且是主键。 DnD 是布尔值。

USER_FRIEND:包含用户的好友ID。 UserIDFriendID 都是整数。

问题:

对于给定的 UserIDFriendID 我想写一个 单个 查询返回布尔值 (SELECT CASE WHEN EXISTS) returns true 在任一情况下:

如果给定的用户 ID DnDUSER_DND

中设置为 false

如果给定的用户 ID DnDUSER_DND 中设置为真并且给定的 FriendID 在 USER_FRIEND 中存在 UserID

补充:

这两个是行数较多的表。查询需要非常快。所以我不喜欢使用 or 。两者都有严重的性能损失。

您可以尝试使用 LEFT JOIN :

SELECT MAX(CASE WHEN ud.dnd = 'FALSE' THEN 'TRUE'
                WHEN uf.FriendID = YourGivenFriendID THEN 'TRUE'
                ELSE 'FALSE'
           END) as user_ind
FROM USER_DND ud
LEFT JOIN USER_FRIEND uf
 ON(ud.userID = uf.userID)
WHERE uf.userID = YourGivenID

我假设每个用户可以有多个朋友,因此 MAX() ,如果是 1-1 ,你可以删除 MAX()