2014-09-20 94 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