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同じものを共有しNumber、その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

Number111 は と で終わる 1 回出現するためFile、1だけカウントする必要があります。先に述べた2つの条件を正しく適用するにはどうすればよいですか?_1_2

4

4 に答える 4

11

SELECT構文で説明されているように:

このHAVING句は、アイテムがクライアントに送信される直前のほぼ最後に適用され、最適化は行われません。

つまり、グループ化操作が実行された後に適用されます(グループ化操作の前にWHERE実行されるとは対照的です)。WHEREvsHAVINGを参照してください。

したがって、現在のクエリは最初に次の結果セットを形成します。

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拡張機能GROUP BYで説明されているように、各グループの値の1つにすぎません。

サーバーは各グループから任意の値を自由に選択できるため、同じでない限り、選択される値は不確定です。

次に、現在のクエリは、HAVING句に従ってこれらの結果をフィルタリングします。

HAVING   COUNT(Number) > 1 AND file LIKE '%\_1'

上記で選択した値を使用するとfile、すべてのグループが2番目の基準に一致します。最初の2つのグループは最初の基準で一致します。したがって、完全なクエリの結果は次のとおりです。

| ドメインの合計| ファイル|
---------------------------
| 2 | aaa.com_1 |
| 2 | bbb.com_1 |

上記のコメントに続いて、グループ化するfile にレコードをフィルタリングしてから、複数の一致を含むグループの結果のグループをフィルタリングします。したがって、とをそれぞれ使用WHEREします(各グループを識別する代わりにをHAVING選択します)。Numberfile

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 に答える
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 に答える