【问题标题】:Fetch parent data based on conditions on child and its child根据子及其子的条件获取父数据
【发布时间】: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_useruser_notification_tokens 之间的简单连接。您能否发布每个表中的行示例以及您希望查询从这些输入中生成的行示例?
  • @MichaelBerkowski 非常感谢,GMB 提供了一个工作示例

标签: mysql sql database join where-clause


【解决方案1】:

我认为一个简单的 JOIN 应该可以满足您的要求:

SELECT unt.token
FROM user_notification_tokens unt
INNER JOIN show_user su ON su.user_id = unt.user_id AND su.show_id = ?
WHERE unt.platform = 'iOS'

您可以将问号替换为您要查找的节目的ID。

这假设每个用户只能订阅每个节目一次(否则您会得到重复),鉴于您提供的信息,这似乎是相关的。

【讨论】:

  • 欢迎@MahmoudTarek!
猜你喜欢
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2018-10-21
  • 1970-01-01
  • 2022-01-04
  • 2015-11-12
相关资源
最近更新 更多