我真正需要执行的查询如下:
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
我有什么想法可以让这项工作成功吗?没有明显的诉诸于两个单独的查询?
答案 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