我有一个问题如何在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;
PHRASE
和TIMESTAMP
是表格中的列。
该代码选择前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'
我不知道,正确的语法是怎样的。 希望在这里有任何帮助。 谢谢!
答案 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;