MySQL - 从双嵌套子查询引用外部表值

时间:2013-11-26 19:38:59

标签: mysql sql subquery

我真正需要执行的查询如下:

SELECT      u.points
        (SELECT COUNT(1) FROM (SELECT 1 FROM checkin c INNER JOIN wineries w ON w.id = c.winery_id WHERE c.user_id = u.id GROUP BY region_id) b) as states_visited
FROM        users u
GROUP BY u.id
ORDER BY points DESC

但是,这会导致以下错误:

'where子句'中的未知列'u.id'

我尝试过用户定义的变量,没有错误,但由于某种原因,它实际上并没有引用用户定义的变量值:

SELECT      @uid := u.id, u.points
        (SELECT COUNT(1) FROM (SELECT 1 FROM checkin c INNER JOIN wineries w ON w.id = c.winery_id WHERE c.user_id = @uid GROUP BY region_id) b) as states_visited
FROM        users u
GROUP BY u.id
ORDER BY points DESC

我有什么想法可以让这项工作成功吗?没有明显的诉诸于两个单独的查询?

3 个答案:

答案 0 :(得分:2)

为什么需要双重嵌套?如果id是表user的主键,则您也不需要GROUP BY

SELECT      u.points,
        (SELECT COUNT(1) FROM reviews WHERE user_id = u.id) AS review_count
FROM        users AS u
-- GROUP BY u.id
ORDER BY points DESC ;

您还可以在派生表中GROUP BY - 然后加入:

SELECT      u.points,
            COALESCE(r.review_count,0) AS review_count
FROM        users AS u
    LEFT JOIN
        (SELECT user_id, COUNT(1) AS review_count
         FROM reviews
         GROUP BY user_id
        ) AS r
        ON  r.user_id = u.id
ORDER BY points DESC ;

或加入,然后GROUP BY

SELECT      u.points,
            COUNT(r.user_id) AS review_count
FROM        users AS u
    LEFT JOIN
            reviews AS r
        ON  r.user_id = u.id
GROUP BY u.id, u.points
ORDER BY points DESC ;

编辑后的版本更难,但也可以在没有双重嵌套的情况下完成:

SELECT      u.points,
        (SELECT COUNT(DISTINCT region_id) 
         FROM checkin c INNER JOIN wineries w ON w.id = c.winery_id 
         WHERE c.user_id = u.id 
        ) AS states_visited
FROM        users u
ORDER BY points DESC ;

答案 1 :(得分:0)

看起来你可以通过一个简单的表连接来做你想做的事情

SELECT u.id AS `id`, u.points AS `points`, COUNT(r.review_id) AS `review_count` /* or whatever the id record for reviews table is */
FROM users AS u
INNER JOIN reviews AS r
  ON u.id = r.user_id
GROUP BY `id`
ORDER BY `points` DESC

答案 2 :(得分:0)

SELECT users.id, users.points, count(*)
FROM users, reviews
WHERE users.id = reviews.user_id
GROUP BY id,points
ORDER BY points DESC

sqlFiddle example

相关问题