我有一张类似于:
的表格domain | file | Number
------------------------------------
aaa.com | aaa.com_1 | 111
bbb.com | bbb.com_1 | 222
ccc.com | ccc.com_2 | 111
ddd.com | ddd.com_1 | 222
eee.com | eee.com_1 | 333
我需要查询共享相同Domains
的{{1}}的数量,并且Number
的{{1}}名称以File
结尾。我尝试了以下方法:
_1
它给了我:
select count(domain) as 'sum domains', file
from table
group by Number
having
count(Number) >1 and File like '%\_1';
我希望看到以下内容:
sum domains | file
------------------------------
2 | aaa.com
2 | bbb.com
由于sum domains | file
------------------------------
1 | aaa.com
2 | bbb.com
111出现一次,Number
以File
和_1
结尾,因此它应仅计为1。我如何正确应用前面所述的两个条件?
答案 0 :(得分:7)
如SELECT
语法:
HAVING
子句几乎在最后一次应用,就在项目发送到客户端之前,没有优化。
换句话说,在执行分组操作后应用(与WHERE
相反,后者在任何分组操作之前执行)。请参阅WHERE vs HAVING。
因此,您当前的查询首先从以下内容形成结果集:
SELECT COUNT(domain) AS `sum domains`, file
FROM `table`
GROUP BY Number
在sqlfiddle上看到它:
| SUM DOMAINS | FILE | --------------------------- | 2 | aaa.com_1 | | 2 | bbb.com_1 | | 1 | eee.com_1 |
正如您所看到的,为file
列选择的值只是每个组中的一个值 - 如MySQL Extensions to GROUP BY
中所述:
服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。
您当前的查询会根据您的HAVING
子句继续过滤这些结果:
HAVING COUNT(Number) > 1 AND file LIKE '%\_1'
使用上面选择的file
值,每个组匹配第二个标准;前两个组匹配第一个标准。因此the complete query的结果是:
| SUM DOMAINS | FILE | --------------------------- | 2 | aaa.com_1 | | 2 | bbb.com_1 |
关注your comments above,您希望在分组之前过滤file
上的记录,然后针对包含多个匹配的组过滤结果组。因此,分别使用WHERE
和HAVING
(并选择Number
代替file
来识别每个群组):
SELECT Number, COUNT(*) AS `sum domains`
FROM `table`
WHERE file LIKE '%\_1'
GROUP BY Number
HAVING `sum domains` > 1
在sqlfiddle上看到它:
| NUMBER | SUM DOMAINS | ------------------------ | 222 | 2 |
答案 1 :(得分:0)
尝试下面的嵌套查询:
select count(domain) as 'sum domains', domain as fileName
from
(select domain, file from tableName
group by Number
having count(Number) >1) as temp
WHERE file like '%\_1';
答案 2 :(得分:0)
如果文件名不在SELECT
中,则不能在GROUP BY
语句中使用该文件名。您必须将GROUP BY
结果({1}})恢复为原始版本并添加过滤器逻辑,如下所示:
JOIN
答案 3 :(得分:0)
我正在关注
$scope.$on('$destroy', function () {
$window.onscroll = undefined;
});