如何在有条款的情况下制定两个条件

时间:2012-12-15 22:40:04

标签: mysql

我有一张类似于:

的表格
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出现一次,NumberFile_1结尾,因此它应仅计为1。我如何正确应用前面所述的两个条件?

4 个答案:

答案 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 上的记录,然后针对包含多个匹配的组过滤结果组。因此,分别使用WHEREHAVING(并选择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;
});