重用LEFT JOIN的问题导致WHERE和ORDER BY子句

时间:2014-09-20 19:37:39

标签: mysql sql

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。为什么? (我删除了标记的部分,查询有效!)

我的查询需要更改什么?如果你能给它一个解释,那就太好了!

1 个答案:

答案 0 :(得分:3)

您将OUTER JOIN标记为WHERE,否定了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

第二个音符,{{1}}最后不能出现。我也把它移到了正确的位置。