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。 UserIDFriendID 都是整数。

问题:

对于给定的 UserIDFriendID,我想编写一个 single 查询返回布尔值 (SELECT CASE WHEN EXISTS),它在任何一种情况下都返回 true: p>

如果给定的 UserID 的 DnDUSER_DND 中设置为 false

如果给定 UserID 的 DnDUSER_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 引发无法设置未定义错误的属性“道具”

怎么查看已安装的mysql用户名密码?

Woocommerce - 未登录用户的购物车为空

在 IIS 上将客户端证书选项设置为“已接受”时未调用 CustomCertificateValidator

如何在页面打开后从 cookie 中正确设置属性(如果用户已登录)或使用路由器和 redux 在 React 中使用 F5

iOS 框架 - 已加载 nib 但未设置视图出口