2013-11-26 142 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