Reputation:
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?
Upvotes: 2
Views: 76
Reputation: 29051
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
Upvotes: 0
Reputation: 883
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
Upvotes: 1
Reputation: 12196
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
Upvotes: 1
Reputation: 7242
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
Upvotes: 0