mysql使用计算列在哪里/有

时间:2012-06-28 12:58:20

标签: mysql select alias where having

我有一个问题如何在where / having子句中使用“alias”列。我知道有一个相关主题的问题。但我通过网络搜索并在stackoverfolw上搜索并找不到解决方案。

所以我希望以这种方式提供帮助..

以下陈述效果很好:

SELECT PHRASE,COUNT(*) AS A 
    FROM my_statistics 
    WHERE TIMESTAMP>NOW()-INTERVAL 7 DAY
    GROUP BY PHRASE ORDER BY A DESC 
    LIMIT 16;

PHRASETIMESTAMP是表格中的列。 该代码选择前16个PHRASES,这些PHRASES是用户在过去7天内插入的。 还有一个列USER,所以我现在想要选择由多个用户插入的前16个短语。 所以我试过这个:

SELECT PHRASE,COUNT(*) AS A, COUNT(DISTINCT(USER)) AS B
    FROM my_statistics
    WHERE TIMESTAMP>NOW()-INTERVAL 7 DAY
          AND B>1
    GROUP BY PHRASE ORDER BY A DESC 
    LIMIT 16;

关于stackoverflow的其他问题,我喜欢这个信息,我必须使用HAVING

SELECT PHRASE,COUNT(*) AS A, COUNT(DISTINCT(USER)) AS B
    FROM my_statistics
    WHERE TIMESTAMP>NOW()-INTERVAL 7 DAY      
    GROUP BY PHRASE ORDER BY A DESC 
    HAVING B>1
    LIMIT 16;

但这会返回错误:

  

您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在'HAVING B> 1'附近使用正确的语法       第5行限制16'

我不知道,正确的语法是怎样的。 希望在这里有任何帮助。 谢谢!

1 个答案:

答案 0 :(得分:2)

ORDER BY A DESC放在Having子句之后。

SELECT phrase, 
       Count(*)                AS A, 
       Count(DISTINCT( user )) AS B 
FROM   my_statistics 
WHERE  timestamp > Now() - INTERVAL 7 day 
GROUP  BY phrase 
HAVING b > 1 
ORDER  BY a DESC 
LIMIT  16;