Î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
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.
- Unii oameni încă îl învață
- Unii au
column number
în diagrame SQL . Un rând spune: Sortează rezultatul după numărul coloanei date sau după o expresie. Dacă expresia este un singur parametru, atunci valoarea este interpretată ca un număr de coloană. Numerele de coloane negative inversează ordinea de sortare. - Apache și-a depreciat utilizarea, deoarece SQL Server a
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ă
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:
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
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).
order by 1
numai când stați la promptulmysql>
. În cod, utilizațiORDER BY id ASC
. Rețineți cazul, numele câmpului explicit și direcția explicită de comandă.