【问题标题】:how correctly execute query?如何正确执行查询?
【发布时间】:2014-01-29 08:39:49
【问题描述】:

STRUCTURE TABLES AND ERROR WHEN EXECUTE QUERY ON SQLFIDDLE

查询:

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

当我使用查询时出现错误:

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

我知道“SumLikes”中的错误,但是如何正确地进行 sql 查询?

请告诉我如何制作它?

【问题讨论】:

    标签: mysql sql select group-by having


    【解决方案1】:

    在为列添加别名时,我们需要以不同的方式对其进行处理。

    删除SumLikes &gt; 20 并在GROUP BY之后添加一个额外的命令

    例子:

    HAVING SumLikes > 20
    

    【讨论】:

      【解决方案2】:

      你不能在 where 子句中使用像 sum() 这样的聚合字段,你应该使用 having

      查询的结尾可能是:

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

      当然要删除where 中的SumLikes &gt; 20

      查看此内容了解更多信息:MySQL Extensions to GROUP BY

      【讨论】:

        【解决方案3】:

        将其包装在子查询中

        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
        

        【讨论】:

        • 或者直接改回 (SUM(l.Type = 'up') - SUM(l.Type = 'down'))
        【解决方案4】:

        试试这个:

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-10
          • 2015-04-17
          相关资源
          最近更新 更多