Mysql
 sql >> база данни >  >> RDS >> Mysql

GROUP BY не премахва дубликати

GROUP BY не "премахва дубликати". GROUP BY позволява агрегиране. Ако всичко, което искате, е да комбинирате дублирани редове, използвайте SELECT DISTINCT.

Ако трябва да комбинирате редове, които се дублират в някои колони, използвайте GROUP BY, но трябва да укажете какво да правите с другите колони. Можете или да ги пропуснете (като не ги посочите в клаузата SELECT), или да ги агрегирате (като използвате функции като SUM, MIN и AVG). Например:

SELECT watch.watch_id, COUNT(rec.street_number), MAX(watch.watch_date)
... GROUP by watch.watch_id

РЕДАКТИРАНЕ

ОП поиска известно разяснение.

Помислете за "изглед" - всички данни, събрани от FROM и JOIN и WHERE - наречете това V. Има две неща, които може да искате да направите.

Първо, може да имате напълно дублиращи се редове които искате да комбинирате:

a b c
- - -
1 2 3
1 2 3
3 4 5

След това просто използвайте DISTINCT

SELECT DISTINCT * FROM V;

a b c
- - -
1 2 3
3 4 5

Или може да имате частично дублиращи се редове които искате да комбинирате:

a b c
- - -
1 2 3
1 2 6
3 4 5

Тези първи два реда са „едни и същи“ в известен смисъл, но ясно се различават в друг смисъл (по-специално те не биха да бъдат комбинирани чрез SELECT DISTINCT). Вие трябва да решите как да ги комбинирате. Можете да отхвърлите колона c като маловажна:

SELECT DISTINCT a,b FROM V;

a b
- -
1 2
3 4

Или можете да извършите някакъв вид агрегиране върху тях. Можете да ги добавите:

SELECT a,b, SUM(c) "tot" FROM V GROUP BY a,b;

a b tot
- - ---
1 2 9
3 4 5

Можете да добавите изберете най-малката стойност:

SELECT a,b, MIN(c) "first" FROM V GROUP BY a,b;

a b first
- - -----
1 2 3
3 4 5

Или можете да вземете средната стойност (AVG), стандартното отклонение (STD) и която и да е от куп други функции, които приемат куп стойности за c и да ги комбинирате в една.

Това, което всъщност не е опция, е просто да не правите нищо. Ако просто изброите негрупираните колони, СУБД или ще изведе грешка (Oracle прави това -- правилният избор, imo), или ще избере една стойност повече или по-малко на случаен принцип (MySQL). Но както д-р Пърт каза:„Когато решите да не решите, вие все пак сте направили избор.“



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:Къде между две дати без година?

  2. MYSQL LEFT JOIN оптимизация с CASE

  3. Правете изчисления в MySQL срещу PHP

  4. Node.js &MySQL - Грешка:1251 - Клиентът не поддържа протокол за удостоверяване, поискан от сървъра; помислете за надграждане на MySQL клиент

  5. Защо моята дата от mysql намалява с един ден в javascript?