7

問題はこれです。

表はこちらです。

+--------------------------+---------+------+-----+---------+----------------+
| Field                    | Type    | Null | Key | Default | Extra          |
+--------------------------+---------+------+-----+---------+----------------+
| facility_map_id          | int(10) | NO   | PRI | NULL    | auto_increment |
| facility_map_facility_id | int(10) | NO   | MUL | NULL    |                |
| facility_map_listing_id  | int(10) | NO   |     | NULL    |                |
+--------------------------+---------+------+-----+---------+----------------+

データはこちらです。

+-----------------+--------------------------+-------------------------+
| facility_map_id | facility_map_facility_id | facility_map_listing_id |
+-----------------+--------------------------+-------------------------+
|             248 |                        1 |                      18 |
|             259 |                        1 |                      19 |
|             206 |                        1 |                      20 |
|             244 |                        1 |                      21 |
|             249 |                        2 |                      18 |
|             207 |                        2 |                      20 |
|             208 |                        3 |                      20 |
|             245 |                        3 |                      21 |
|             260 |                        4 |                      19 |
|             261 |                        5 |                      19 |
|             246 |                        6 |                      21 |
|             250 |                        7 |                      18 |
|             247 |                        8 |                      21 |
+-----------------+--------------------------+-------------------------+

私はこのクエリを実行します:

SELECT facility_map_listing_id 
FROM facility_map 
WHERE facility_map_facility_id IN(1, 2) 
GROUP BY facility_map_listing_id 
HAVING count(DISTINCT facility_map_facility_id) >= 2 

そしてこれを入手してください。

+-------------------------+
| facility_map_listing_id |
+-------------------------+
|                      18 |
|                      20 |
+-------------------------+
2 rows in set (0.00 sec)

どちらが正しい!-しかし、誰でも説明できますか、なぜGROUP BYをステートメントに含める必要があるのですか?

それがIsntであり、同じクエリを実行してGROUPBYを除外した場合。

+-------------------------+
| facility_map_listing_id |
+-------------------------+
|                      18 |
+-------------------------+
1 row in set (0.00 sec)

誰かが私にこれを説明できますか?ありがとうございました!

4

3 に答える 3

6

がないgroup by場合、のような集合体countはセット全体で機能します。したがって、このクエリは0行または1行を返します。

SELECT facility_map_listing_id 
FROM facility_map 
WHERE facility_map_facility_id IN(1, 2)
HAVING count(DISTINCT facility_map_facility_id) >= 2 

条件が満たされた場合は1行を返しhaving、それ以外の場合は空のセットを返します。

ここで、group byを使用して、havingの各値の条件を評価しますfacility_map_listing_id。これは、の個別の値と同じ数の行を返す可能性がありますfacility_map_listing_id

于 2012-05-27T15:48:19.280 に答える
6

私はこれが物事を説明するべきだと思います:

group byを省略すると、where句で除外されていないすべての行が単一のグループとして返​​されます。

したがって、基本的には、セット全体でグループ化を使用しています。

于 2012-05-27T15:48:48.357 に答える
1

句なしでHAVING句を使用できGROUP BYますが、SELECT列とHAVING列は集計関数で使用する必要があります。

  • AVG()-平均値を返します
  • COUNT()-行数を返します
  • FIRST()-最初の値を返します
  • LAST()-最後の値を返します
  • MAX()-最大値を返します
  • MIN()-最小値を返します
  • SUM()-合計を返します

HAVINGは通常、GROUP BY句とともに使用され、主に集計関数を使用してデータを操作およびフィルタリングするために使用されます。GROUP BYが使用されていない場合、HAVINGはWHERE句のように動作します。

HAVING は、group bywhereがselect句の条件を設定するのと同様に、句の条件を設定します。

これこれを参照してください

于 2012-05-27T15:54:58.763 に答える