MySQL:如果用户未设置 dnd 或用户已设置 dnd,则布尔查询返回 true 给定 ID 必须是朋友
Posted
技术标签:
【中文标题】MySQL:如果用户未设置 dnd 或用户已设置 dnd,则布尔查询返回 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 【发布时间】:2016-06-26 07:43:16 【问题描述】:我有这些简单的表格:
1. USER_DND
╔════════╦══════╗
║ UserID ║ DnD ║
╠════════╬══════╣
╚════════╩══════╝
2. USER_FRIEND
╔════════╦══════════╗
║ UserID ║ FriendID ║
╠════════╬══════════╣
╚════════╩══════════╝
USER_DND
:它包含用户的 ID 和他们的请勿打扰 (Dnd) 标志。 UserID
是整数并且是主键。 DnD
是布尔值。
USER_FRIEND
:包含用户好友的ID。 UserID
和 FriendID
都是整数。
问题:
对于给定的 UserID
和 FriendID
,我想编写一个 single 查询返回布尔值 (SELECT CASE WHEN EXISTS
),它在任何一种情况下都返回 true: p>
如果给定的 UserID 的 DnD
在 USER_DND
中设置为 false
或
如果给定 UserID 的 DnD
在 USER_DND
中设置为 true,并且给定的 FriendID 在 USER_FRIEND
中存在 UserID
补充:
这两个是具有大量行的表。查询需要非常快。所以我不喜欢使用OR
in where clause of query 或query having subqueries。两者都有严重的性能损失。
【问题讨论】:
第二个条件的逻辑我看不懂,没有多大意义。FriendID
只存在于 USER_FRIEND
中,怎么可能不存在呢?
你的SHOW CREATE TABLE
看起来像这些?性能的关键是索引。
@sagi:已更新问题以使其更加清晰。请立即检查。谢谢。
@tadman:这是从具有太多列和索引的大表翻译而来的,以便在 SO 上提出问题。正如我所说,USER_DND 具有主键,因此它本身就是索引,并且在 USER_FRIEND 中,用户 ID 被索引。
你对UserId, FriendID
都有索引吗?在进行JOIN
时,这一点非常重要。这就是为什么添加表的架构(即使是代表性版本)非常重要,而图表并没有太大帮助。
【参考方案1】:
您可以尝试使用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()
【讨论】:
极好的解决方案:)以上是关于MySQL:如果用户未设置 dnd 或用户已设置 dnd,则布尔查询返回 true 给定 ID 必须是朋友的主要内容,如果未能解决你的问题,请参考以下文章
使用 HOC 可拖动元素反应 DnD 引发无法设置未定义错误的属性“道具”
在 IIS 上将客户端证书选项设置为“已接受”时未调用 CustomCertificateValidator
如何在页面打开后从 cookie 中正确设置属性(如果用户已登录)或使用路由器和 redux 在 React 中使用 F5