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。 UserID
和 FriendID
都是整数。
问题:
对于给定的 UserID
和 FriendID
我想写一个 单个 查询返回布尔值 (SELECT CASE WHEN EXISTS
) returns true 在任一情况下:
如果给定的用户 ID DnD
在 USER_DND
中设置为 false
或
如果给定的用户 ID DnD
在 USER_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()
我有这些简单的表格:
1. USER_DND
╔════════╦══════╗
║ UserID ║ DnD ║
╠════════╬══════╣
╚════════╩══════╝
2. USER_FRIEND
╔════════╦══════════╗
║ UserID ║ FriendID ║
╠════════╬══════════╣
╚════════╩══════════╝
USER_DND
:它包含用户的 ID 和他们的请勿打扰 (Dnd) 标志。 UserID
是整数并且是主键。 DnD
是布尔值。
USER_FRIEND
:包含用户的好友ID。 UserID
和 FriendID
都是整数。
问题:
对于给定的 UserID
和 FriendID
我想写一个 单个 查询返回布尔值 (SELECT CASE WHEN EXISTS
) returns true 在任一情况下:
如果给定的用户 ID DnD
在 USER_DND
或
如果给定的用户 ID DnD
在 USER_DND
中设置为真并且给定的 FriendID 在 USER_FRIEND
中存在 UserID
补充:
这两个是行数较多的表。查询需要非常快。所以我不喜欢使用
您可以尝试使用 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()