În interogările SQL, folosim clauza Group by clause pentru a aplica funcții agregate.

  • Dar care este scopul utilizării valorii numerice în loc de numele coloanei cu gruparea prin clauză? De exemplu: grupați după 1.

Comentarii

  • Utilizați order by 1 numai când stați la promptul mysql> . În cod, utilizați ORDER BY id ASC. Rețineți cazul, numele câmpului explicit și direcția explicită de comandă.

Răspuns

Acesta este de fapt un lucru foarte rău lucru de făcut IMHO și nu este acceptat în majoritatea celorlalte platforme de baze de date.

Motivele pentru care oamenii o fac:

  • they „re lazy – Nu știu de ce oamenii cred că productivitatea lor este îmbunătățită scriind codul mai degrabă decât tastând pentru 40 de milisecunde în plus pentru a obține un cod mult mai literal.

Motivele pentru care este „rău:

  • nu se autodocumentează – cineva va trebui să meargă să analizeze lista SELECT pentru a afla gruparea. De fapt, ar fi puțin mai clar în SQL Server, care nu acceptă cowboy care- știe ce se va întâmpla gruparea ca MySQL.

  • este fragil – vine cineva și schimbă lista SELECT deoarece utilizatorii de afaceri au dorit o ieșire de raport diferită, iar acum ieșirea dvs. este o mizerie. Dacă ați fi folosit nume de coloane în GROUP BY, ordinea din lista SELECT ar fi irelevantă.

SQL Server acceptă ORDER BY [ordinal]; iată câteva argumente paralele împotriva utilizării sale:

Răspuns

MySQL vă permite să faceți GROUP BY cu aliasuri ( Probleme cu pseudonimele coloanei ). Ar fi mult mai bine decât să faci GROUP BY cu numere.

Google are multe exemple de utilizare și de ce mulți au încetat să-l folosească.

Pentru a fi sincer cu dvs., nu am folosit numerele de coloană pentru ORDER BY și GROUP BY din 1996 (făceam Oracle PL / SQL Development la acea vreme). Folosirea numerelor de coloană este cu adevărat pentru vechi și compatibilitatea inversă permite acestor dezvoltatori să utilizeze MySQL și alte RDBMS-uri care încă permiteți acest lucru.

Răspuns

Luați în considerare mai jos majuscule:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Apps | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Apps | 1 | | 2016-05-31 | Videos | 1 | | 2016-05-31 | Videos | 1 | | 2016-06-01 | Apps | 3 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Videos | 2 | | 2016-06-01 | Apps | 2 | +------------+--------------+-----------+ 

Trebuie să aflați numărul de descărcări pe serviciu pe zi, considerând aplicații și aplicații ca fiind același serviciu. Gruparea după date, services ar duce la Apps și la Applications considerate servicii separate.

În acest caz, interogarea ar fi:

 select date, services, sum(downloads) as downloads from test.zvijay_test group by date,services 

Și ieșire:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Apps | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Apps | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Dar acest lucru nu este ceea ce doriți, deoarece cerințele sunt grupate de aplicații și aplicații. Deci, ce putem face?

O modalitate este de a înlocui Apps cu Applications utilizând un CASE expresie sau funcția IF și apoi gruparea acestora pe servicii ca:

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,services 

Dar acest lucru încă grupează serviciile considerând Apps și Applications drept servicii diferite și oferă același rezultat ca anterior:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Applications | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Applications | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Gruparea pe un număr de coloană vă permite să grupați date pe o coloană aliasată.

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,2; 

Și astfel vă oferim rezultatul dorit după cum urmează:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 4 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 9 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

I „ve citiți de multe ori că acesta este un mod leneș de a scrie interogări sau de a grupa peste o coloană aliasată nu funcționează în MySQL, dar aceasta este modalitatea de a grupa peste coloane aliasate.

Acesta nu este modul preferat de a scrie interogări, utilizați-l numai atunci când chiar trebuie să vă grupați pe o coloană aliasată.

Comentarii

  • " Dar aceasta grupează totuși serviciile considerând aplicații și aplicații ca servicii diferite și oferă același rezultat ca anterior ".' nu s-ar rezolva acest lucru dacă ' ați ales un nume diferit (fără conflict) pentru alias?
  • @ Daddy32 Exact gândul meu. Sau chiar cuibărește încă o dată (grup după selectare)

Răspuns

Nu există niciun motiv valid pentru al folosi. Este pur și simplu o comandă rapidă leneșă special concepută pentru a face dificil pentru un dezvoltator greu presat să-și descopere gruparea sau sortarea ulterior sau pentru a permite codului să eșueze lamentabil atunci când cineva schimbă ordinea coloanei. Fii atent la colegii tăi dezvoltatori și nu o face.

Răspunde

Acest lucru este funcțional pentru mine. Codul grupează rânduri de până la 5 grupuri.

SELECT USR.UID, USR.PROFILENAME, ( CASE WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN @curRow := 0 ELSE @curRow := @curRow + 1 /*@curRow := 1*/ /*AND @curCode := USR.UID*/ END ) AS sort_by_total FROM SS_USR_USERS USR, ( SELECT @curRow := 0, @curCode := "" ) rt ORDER BY USR.PROFILENAME, USR.UID 

Rezultatul va fi după cum urmează

introduceți descrierea imaginii aici

Răspuns

SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2; SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3; 

Luați în considerare interogările de mai sus: Grupați cu 1 înseamnă să grupați după prima coloană și grupați cu 1,2 înseamnă să grupați după prima și a doua coloană și grupați cu 1,2,3 înseamnă să grupați după prima a doua și a treia coloană. De exemplu:

grupați după 1,2

această imagine prezintă primele două coloane grupate la 1,2, adică nu se iau în considerare diferitele valori ale dep_date pentru a găsi numărul (pentru a calcula numărul se iau în considerare toate combinațiile distincte ale primelor două coloane) întrucât a doua interogare are ca rezultat acest grupați după 1,2,3

imagine. Aici se ia în considerare toate primele trei coloane și există valori diferite pentru a găsi numărul, adică se grupează după toate primele trei coloane (pentru a calcula numărul se iau în considerare toate combinațiile distincte ale primelor trei coloane).

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *