2014-09-20 95 views
0
SELECT s.*, 
u.username, 
u.fullname, 
c.title AS ctitle, 
c.description AS cdescription, 
sa.attention, 
sp.popularity, 
COUNT(DISTINCT f.id) AS favorites, 
COUNT(DISTINCT st.id) AS stars, 
COUNT(DISTINCT v.id) AS views 
FROM shots s 
INNER JOIN users u ON u.id = s.user_id 
INNER JOIN categories c ON c.id = s.cat_id 
LEFT OUTER JOIN(
    SELECT shot_id, round(AVG(count),2) AS attention 
    FROM points 
    WHERE date > DATE_SUB(CURDATE(),INTERVAL 2 DAY) 
    GROUP BY shot_id 
) sa ON sa.shot_id = s.id 
LEFT OUTER JOIN(
    SELECT shot_id, SUM(count) AS popularity 
    FROM points 
    GROUP BY shot_id 
) sp ON sp.shot_id = s.id 
LEFT OUTER JOIN favorites f ON f.shot_id = s.id 
LEFT OUTER JOIN stars st ON st.shot_id = s.id 
LEFT OUTER JOIN views v ON v.shot_id = s.id 
**WHERE s.library = 1 AND sa.attention > 40 
ORDER BY sa.attention DESC 
LIMIT 0,50** 
GROUP BY s.id 

我無法在條件和排序中使用sa.attention。爲什麼? (我刪除了標記的部分,查詢工作!)重複使用LEFT JOIN導致WHERE和ORDER BY子句的問題條款

我需要更改我的查詢?如果你可以給它一個解釋,那就太好了!

回答

3

通過將OUTER JOIN置入您的WHERE標準中,您將否定您的OUTER JOIN。它移動到你的JOIN,你會得到你的NULL記錄回:

SELECT s.*, 
    u.username, 
    u.fullname, 
    c.title AS ctitle, 
    c.description AS cdescription, 
    sa.attention, 
    sp.popularity, 
    COUNT(DISTINCT f.id) AS favorites, 
    COUNT(DISTINCT st.id) AS stars, 
    COUNT(DISTINCT v.id) AS views 
FROM shots s 
    INNER JOIN users u ON u.id = s.user_id 
    INNER JOIN categories c ON c.id = s.cat_id 
    LEFT OUTER JOIN(
     SELECT shot_id, round(AVG(count),2) AS attention 
     FROM points 
     WHERE date > DATE_SUB(CURDATE(),INTERVAL 2 DAY) 
     GROUP BY shot_id 
    ) sa ON sa.shot_id = s.id AND sa.attention > 40 
    LEFT OUTER JOIN(
     SELECT shot_id, SUM(count) AS popularity 
     FROM points 
     GROUP BY shot_id 
    ) sp ON sp.shot_id = s.id 
    LEFT OUTER JOIN favorites f ON f.shot_id = s.id 
    LEFT OUTER JOIN stars st ON st.shot_id = s.id 
    LEFT OUTER JOIN views v ON v.shot_id = s.id 
WHERE s.library = 1 
GROUP BY s.id 
ORDER BY sa.attention DESC 
LIMIT 0,50 

第二個音符,GROUP BY不能走到底。我把它移到了正確的位置。

+0

這就是我想要的。有用 :)。謝謝!我怎麼看不到... – Smeaven 2014-09-20 19:48:15