由于第二级子查询嵌套,列不明

时间:2018-06-19 11:43:18

标签: mysql sql subquery correlated-subquery

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

但是,在尝试所有查询后,我总是以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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为以下查询对您有用。您可以在两个参数中传递要计算其等级的用户的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