【问题标题】:MySQL pass parents field to subquery without using JOINSMySQL将父字段传递给子查询而不使用JOINS
【发布时间】:2019-05-02 10:21:18
【问题描述】:

我需要将字段传递给子查询,而不是使用 JOIN,但大多数在线示例仅显示如何使用连接来执行此操作。

场景如下:

我在系统上有一个帐户表。 每个帐户都可以执行任务,这些任务可能会失败。 我想获取一个帐户列表,如果最后两个任务失败,则自定义列“状态”为 -1。

例如

SELECT Account.id, (

    CASE WHEN (

       (SELECT COUNT(*) FROM (

           SELECT id, status FROM Task
           WHERE Task.AccountId = Account.id // <-- Cannot access Account.id here
           HAVING status < 0 // <-- only select failed tasks
           ORDER BY id DESC
           LIMIT 2
       ) as t1)

    ) < 2 THEN 1 ELSE -1 END

) as `status` FROM Account;

计算每个任务的状态是一个繁重的查询(上面没有显示),所以我只想计算属于查询帐户的任务的状态。

我尝试过使用用户变量,将 Account.id 替换为 @AccountId,但我认为不能在这样的子查询中使用它们。

我无法在主 Account 表上使用 JOIN,因为我正在使用 sequelize。但是,如果有帮助,我可以在子查询中使用 JOIN。

【问题讨论】:

  • 我在您的子查询中没有看到 order by。
  • @SalmanA 抱歉,已添加。
  • 你的代码没有做你想做的事。 HAVING 子句不合适。

标签: mysql sql subquery sequelize.js


【解决方案1】:

对于您的特定问题,您可以针对要检查的每个状态使用单独的查询来表达这一点:

select a.*,
       (case when (select t.status
                   from task t
                   where t.AccountId = a.id
                   order by t.id desc
                   limit 1
                  ) = -1 and
                  (select t.status
                   from task t
                   where t.AccountId = a.id
                   order by t.id desc
                   limit 1 offset 1
                  ) = -1
             then 1 else -1
         end)                  
from accounts a;

为了提高性能,您需要在task(accountid, id, status) 上建立索引。

【讨论】:

    【解决方案2】:

    这是我能想到的唯一解决方案(尽管 可以使用连接)。适用于最后两行:

    SELECT Account.id, (
        SELECT status
        FROM Task
        WHERE Task.AccountId = Account.id
        ORDER BY Task.Id DESC
        LIMIT 0, 1
    ) + (
        SELECT status
        FROM Task
        WHERE Task.AccountId = Account.id
        ORDER BY Task.Id DESC
        LIMIT 1, 1
    ) AS sum_of_last_two
    FROM Account
    

    结果将是 -2、-1 或 0 等,可以在 CASE 内进行测试。您可能希望将每个子查询包装在 COALESCE((...), 0)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多