【问题标题】:Unknown column due to second-level subquery nesting由于二级子查询嵌套导致的未知列
【发布时间】:2018-11-28 08:52:22
【问题描述】:

我想根据给定用户与其他用户相比的点数来检索用户的排名(简单地计算得分比给定用户多的用户)。

但是,在我尝试过的所有查询中,我总是以Column not found: users.id 结束。据我所知,引用相关父列不止一级是有限制的。

我可以重构我的查询,还是真的需要使用SET @rownum := 0 查询样式?

SELECT 
    `users`.*, 
    (
        SELECT COUNT(*) + 1 
        FROM (
            SELECT SUM(`amount`) AS `all_points` 
            FROM `points` 
            WHERE `type` = ? 
            GROUP BY `user_id` 
            HAVING `all_points` > (
                SELECT SUM(`amount`) 
                FROM `points` 
                WHERE `type` = ? and `user_id` = `users`.`id`
            )
        ) `points_sub`
    ) as `rank` 
FROM `users` 
WHERE `users`.`id` = ? 
LIMIT 1

【问题讨论】:

  • MySQL 不支持超过一级深度的关联子句。切换到 MySQL 8+ 并使用窗口函数。
  • @GordonLinoff 感谢您的建议。我希望不必为整个应用程序升级 MySQL 版本。
  • 。 .这有点半开玩笑。您的问题表明您了解使用变量的另一种方法,所以去吧。

标签: mysql sql subquery correlated-subquery


【解决方案1】:

您可以将子条款上移一级,删除having 过滤器并使用where 过滤器

SELECT 
    `users`.*, 
    (
        SELECT COUNT(*) + 1 
        FROM (
            SELECT user_id,SUM(`amount`) AS `all_points` 
            FROM `points` 
            WHERE `type` = ? 
            GROUP BY `user_id` 
        ) `points_sub`
        WHERE `all_points` > 
                SELECT SUM(`amount`) 
                FROM `points` 
                WHERE `type` = ? and `user_id` = `users`.`id`

    ) as `rank` 
FROM `users` 
WHERE `users`.`id` = ?
LIMIT 1

【讨论】:

  • 太棒了!我没想到我可以把那个 WHERE 子句放在points_sub之外。
  • 我不得不在WHERE all_points > SELECT SUM(amount) 部分加上括号,但它起作用了:)
【解决方案2】:

我认为以下查询应该适合您。您可以在两个参数中传递要计算其排名的用户的 user_id。

SELECT 
`users`.*, 
(
    SELECT COUNT(*) + 1 
    FROM (
        SELECT SUM(`amount`) AS `all_points` 
        FROM `points` 
        WHERE `type` = ? 
        GROUP BY `user_id` 
        HAVING `all_points` > (
            SELECT COALESCE(SUM(`amount`),0) 
            FROM `points` 
            WHERE `type` = ? and `user_id` = ?
        )
    ) `points_sub`
) as `rank` 
FROM `users` 
WHERE `users`.`id` = ? 
LIMIT 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 2019-10-12
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多