2013-11-26 143 views
0

查询我真的需要执行是引用外部表值如下:MySQL的 - 从双重嵌套子查询

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 

然而,这将导致以下错误:

未知列在“u.id” “where子句”

我试着与用户定义的变量,没有错误,但它实际上没有引用用户定义的变量值因为某些原因:

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

你能否简单解释一下正在使用的表格,它们的模式以及您实际试图在查询结果中获得的内容? –

+0

你可以在sqlFiddle.com上设置一些测试数据,并解释你期望的结果 –

回答

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 ; 
+0

道歉,我试图在发布之前简化我的查询,但是我花了很多精力!请参阅修订后的子查询,该子查询本身具有创建多行的连接。 –

+1

好的,确实很难。删除双重嵌套和内部的'GROUP BY'并使用'COUNT(DISTINCT region_id)' –

+0

您先生,是一位天才!我喜欢真正降低查询复杂度的解决方案。再次感谢。 –

0

好像你可以做你想做什么用simpe表连接

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 
+0

感谢您的回复,对不起,我不得不进行编辑,请在ypercube的回复中查看评论。 –

+1

@PhilL我还是不明白你为什么需要一个子查询。如果在你的问题中,你描述你的表格,以及你试图在你的查询中得到什么,这可能会有所帮助。 –

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