10

我有一个类似的表:

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共享相同NumberFile名称以_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

因为Number111 出现一次并以andFile结尾,所以它应该只计数 1。我怎样才能正确应用我之前所说的两个条件?_1_2

4

4 回答 4

11

SELECT语法中所述:

HAVING子句几乎在最后应用,就在项目发送到客户端之前,没有优化。

换句话说,它是在分组操作执行之后应用的(相比之下WHERE,它是在任何分组操作之前执行的)。请参阅WHERE 与 HAVING

因此,您当前的查询首先形成以下结果集:

SELECT   COUNT(domain) AS `sum domains`, file
FROM     `table`
GROUP BY Number

sqlfiddle上查看:

| 求和域 | 文件 |
--------------------------
| 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,每个组都匹配第二个标准;前两组在第一个标准上匹配。因此完整查询的结果是:

| 求和域 | 文件 |
--------------------------
| 2 | aaa.com_1 |
| 2 | bbb.com_1 |

根据您上面的评论,您希望在分组file 之前过滤记录,然后过滤包含多个匹配项的结果组。因此分别使用WHEREand HAVING(并选择Number而不是file标识每个组):

SELECT   Number, COUNT(*) AS `sum domains`
FROM     `table`
WHERE    file LIKE '%\_1'
GROUP BY Number
HAVING   `sum domains` > 1

sqlfiddle上查看:

| 号码 | 求和域 |
----------------------
| 222 | 2 |
于 2012-12-16T11:39:27.503 回答
3

我正在使用以下

having ( SUM(qty) > 4 AND SUM(qty) < 15 )
于 2018-11-08T09:30:44.673 回答
1

如果文件名SELECT不在GROUP BY. 你必须得到你的GROUP BY结果而不是JOIN回到原来的并添加过滤器逻辑,如下所示:

SELECT *
FROM
(
 select count(domain) as 'sum_domains', Number
 from table 
 group by Number
 having
 count(Number) >1
) result
join table t on result.Number = t.Number
WHERE file like '%\_1'
于 2017-10-17T18:48:55.873 回答
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';
于 2012-12-15T22:45:58.990 回答