【发布时间】:2020-02-05 23:57:29
【问题描述】:
我的表结构如下:
+-------+-------+-----------+--------------------------+
| users | shows | show_user | user_notification_tokens |
+-------+-------+-----------+--------------------------+
| id | id | id | id |
| | | user_id | user_id |
| | | show_id | token |
| | | | platform |
+-------+-------+-----------+--------------------------+
用户可以订阅许多节目并且节目可以被许多用户订阅,即show_user表。
用户可以在user_notification_tokens 表中拥有多个令牌。
我需要获取某个节目的订阅用户的代币。
我尝试了以下查询,效果很好:
SELECT `token`
FROM `user_notification_tokens`
WHERE `platform` = 'iOS'
AND EXISTS (
SELECT `id`
FROM `users`
WHERE `user_notification_tokens`.`user_id` = `users`.`id`
AND EXISTS (
SELECT*
FROM `shows`
INNER JOIN `show_user`
ON `shows`.`id` = `show_user`.`show_id`
WHERE `users`.`id` = `show_user`.`user_id`
AND `shows`.`id` = 15
)
)
结果很好,但是加载需要 3.8019 秒,我的结果计数是 716,将来会更多。
我做错了什么以及如何改进此查询?
【问题讨论】:
-
这听起来可能只需要
show_user和user_notification_tokens之间的简单连接。您能否发布每个表中的行示例以及您希望查询从这些输入中生成的行示例? -
@MichaelBerkowski 非常感谢,GMB 提供了一个工作示例
标签: mysql sql database join where-clause