2012-05-27 2 views
6

Вопрос этот ..Понимание GROUP BY поведения в заявлении,

Таблица эта ..

+--------------------------+---------+------+-----+---------+----------------+ 
| 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 |    | 
+--------------------------+---------+------+-----+---------+----------------+ 

Data это ..

+-----------------+--------------------------+-------------------------+ 
| 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 и я бегу тот же запрос, оставляя в GROUP BY я получаю ..

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

Может ли один объяснить мне это? Спасибо!

ответ

5

Без group by агрегат, такой как count, работает на множестве в целом. Таким образом, этот запрос возвращает ноль или один ряд:

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

Она возвращает одну строку, если условие having выполнено, и пустое множество в противном случае.

Теперь, с группой по, он оценивает условие having для каждого значения facility_map_listing_id. Это может возвращать до нескольких строк, так как существуют различные значения facility_map_listing_id.

+0

Brill - объяснил вещи отлично. Спасибо за вашу помощь! –

5

Я думаю this должен объяснить вещи:

Если опустить группу, все строки, не исключенные где положение возвращения в одну группу.

Так что, в основном, вы все еще используете группу по ... всего по всему набору.

+0

Это правильный ответ. –

+0

Спасибо за ресурс! Теперь я понимаю вещи намного лучше. Я поднял ваш ответ! –

1

мы можем использовать предложения HAVING без оговорки GROUP BY но SELECT колонны и HAVING колонны следует использовать с агрегатными функциями:

  • AVG() - Возвращает среднее значение
  • COUNT() - Возвращает количество строк
  • FIRST() - возвращает первое значение
  • LAST() - возвращает последнее значение
  • MAX() - возвращает наибольшее значение
  • MIN() - возвращает наименьшее значение
  • SUM() - возвращает сумму

HAVING обычно используется с пунктом GROUP BY, и в основном используется для манипулирования и фильтрации данных с использованием агрегатных функций. Когда GROUP BY не используется, HAVING ведет себя как предложение WHERE.

HAVING наборы условий для пункта group by, подобно тому, каким образом, где наборы условий для выбора пункта.

See This и This one

 Смежные вопросы

  • Нет связанных вопросов^_^