Question

STRUCTURE TABLES AND ERROR WHEN EXECUTE QUERY ON SQLFIDDLE

QUERY:

SELECT 
            n.Type as Type,
            n.UserIdn as UserIdn,
            u.Username as Username,
            n.NewsIdn as NewsIdn,
            n.Header as Header,
            n.Text as Text,
            n.Tags as Tags,
            n.ImageLink as ImageLink,
            n.VideoLink as VideoLink,
            n.DateCreate as DateCreate,
            SUM(l.Type = 'up') as Uplikes, 
            SUM(l.Type = 'down') as Downlikes,
            (SUM(l.Type = 'up') - SUM(l.Type = 'down')) as SumLikes
        FROM News n 
            INNER JOIN Users u ON n.UserIdn = u.UserIdn 
            LEFT JOIN Likes l ON n.NewsIdn = l.NewsIdn
            WHERE SumLikes > 20 AND n.DateCreate < STR_TO_DATE('2014-01-03 14:17:43', '%Y-%m-%d %H:%i:%s')
        GROUP BY n.id
        ORDER by SumLikes DESC

When i use query i get error:

Unknown column 'SumLikes' in 'where clause'...

I know that error in 'SumLikes' but how correctly make sql query?

Tell me please how make it?

Was it helpful?

Solution

Wrap it in a subquery

SELECT * FROM
(
SELECT 
    n.Type as Type,
    n.UserIdn as UserIdn,
    u.Username as Username,
    n.NewsIdn as NewsIdn,
    n.Header as Header,
    n.Text as Text,
    n.Tags as Tags,
    n.ImageLink as ImageLink,
    n.VideoLink as VideoLink,
    n.DateCreate as DateCreate,
    SUM(l.Type = 'up') as Uplikes, 
    SUM(l.Type = 'down') as Downlikes,
    (SUM(l.Type = 'up') - SUM(l.Type = 'down')) as SumLikes
FROM News n 
    INNER JOIN Users u ON n.UserIdn = u.UserIdn 
    LEFT JOIN Likes l ON n.NewsIdn = l.NewsIdn
    WHERE n.DateCreate < STR_TO_DATE('2014-01-03 14:17:43', '%Y-%m-%d %H:%i:%s')
GROUP BY n.id
) Sub
WHERE Sub.SumLikes > 20
ORDER by Sub.SumLikes DESC

OTHER TIPS

When adding a column an alias, we need to address it diffrently.

Remove SumLikes > 20 and add an extra command after GROUP BY

Example:

HAVING SumLikes > 20

You cant use aggregate fields like sum() in where clause, you shuld use having,

the end of your query could be like:

GROUP BY n.id
HAVING SumLikes > 20
ORDER by SumLikes DESC

ofcourse remove SumLikes > 20 in your where.

Check this out for more information: MySQL Extensions to GROUP BY

Try this:

SELECT 
    n.Type AS TYPE,
    n.UserIdn AS UserIdn,
    u.Username AS Username,
    n.NewsIdn AS NewsIdn,
    n.Header AS Header,
    n.Text AS TEXT,
    n.Tags AS Tags,
    n.ImageLink AS ImageLink,
    n.VideoLink AS VideoLink,
    n.DateCreate AS DateCreate,
    SUM(l.Type = 'up') AS Uplikes, 
    SUM(l.Type = 'down') AS Downlikes,
    (SUM(l.Type = 'up') - SUM(l.Type = 'down')) AS SumLikes
FROM News n 
INNER JOIN Users u ON n.UserIdn = u.UserIdn 
LEFT JOIN Likes l ON n.NewsIdn = l.NewsIdn
WHERE n.DateCreate < '2014-01-03 14:17:43'
GROUP BY n.id HAVING SumLikes > 20 
ORDER BY SumLikes DESC
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top