我有一张类似于的表:
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
Run Code Online (Sandbox Code Playgroud)
我需要查询该Domains共享的编号,Number并以其File名称结尾_1.我尝试了以下方法:
select count(domain) as 'sum domains', file
from table
group by Number
having
count(Number) >1 and File like '%\_1';
Run Code Online (Sandbox Code Playgroud)
它给了我:
sum domains | file
------------------------------
2 | aaa.com
2 | bbb.com
Run Code Online (Sandbox Code Playgroud)
我希望看到以下内容:
sum domains | file
------------------------------
1 | aaa.com
2 | bbb.com
Run Code Online (Sandbox Code Playgroud)
由于Number111出现一次File有目的_1和_2,所以应该只算1.如何正确应用我之前说过的2个条件?
如SELECT语法下所述:
该
HAVING条款几乎在最后一次应用,就在项目发送到客户端之前,没有优化.
换句话说,在执行分组操作之后应用它(与之相反WHERE,在任何分组操作之前执行).见WHERE vs HAVING.
因此,您当前的查询首先从以下形成结果集:
SELECT COUNT(domain) AS `sum domains`, file
FROM `table`
GROUP BY Number
Run Code Online (Sandbox Code Playgroud)
在sqlfiddle上看到它:
| SUM DOMAINS | FILE | --------------------------- | 2 | aaa.com_1 | | 2 | bbb.com_1 | | 1 | eee.com_1 |
如您所见,为file列选择的值只是每个组中的值之一 - 如MySQL Extensions中所述GROUP BY:
服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的.
然后,您当前的查询将根据您的HAVING子句过滤这些结果:
HAVING COUNT(Number) > 1 AND file LIKE '%\_1'
Run Code Online (Sandbox Code Playgroud)
使用file上面选择的值,每个组匹配第二个标准; 前两个组匹配第一个标准.因此,完整查询的结果是:
| SUM DOMAINS | FILE | --------------------------- | 2 | aaa.com_1 | | 2 | bbb.com_1 |
根据您的上述评论,您希望file 在分组之前过滤记录,然后过滤包含多个匹配的结果组.因此分别使用WHERE和HAVING(并选择Number而不是file识别每个组):
SELECT Number, COUNT(*) AS `sum domains`
FROM `table`
WHERE file LIKE '%\_1'
GROUP BY Number
HAVING `sum domains` > 1
Run Code Online (Sandbox Code Playgroud)
在sqlfiddle上看到它:
| NUMBER | SUM DOMAINS | ------------------------ | 222 | 2 |