SQL-kyselyissä käytämme Group by clause -sovellusta yhdistettyjen toimintojen käyttöön.
- Mutta mikä on tarkoitus käyttää numeerista arvoa sarakkeen nimen sijasta Ryhmittele-lauseella? Esimerkiksi: Ryhmittele 1: n mukaan.
Kommentit
Vastaa
Tämä on oikeastaan todella huono asia tehdä IMHO, eikä sitä tueta useimmissa muissa tietokanta-alustoissa.
Syyt ihmisille:
- he ”ovat laiskoja – en tiedä miksi ihmiset ajattelevat heidän tuottavuutensa paranevan kirjoittamalla jakokoodin kirjoittamisen sijaan 40 millisekunnin ylimääräistä aikaa saadakseen paljon kirjaimellisemman koodin.
Syyt sen virheisiin:
-
se ei ole itse dokumentointi – joku joutuu jäsentämään SELECT-luettelon selvittääkseen ryhmittelyn. Se olisi itse asiassa hieman selvempi SQL Serverissä, joka ei tue cowboya kuka- tietää-mitä-tapahtuu-ryhmittely kuten MySQL.
-
se on hauras – joku tulee sisään ja muuttaa SELECT-luetteloa, koska yrityskäyttäjät halusivat erilaista raporttitulosta, ja nyt tulos on sekaisin. Jos olet käyttänyt sarakkeiden nimiä GROUP BY: ssä, SELECT-luettelon järjestyksellä ei ole merkitystä.
SQL Server tukee ORDER BY [järjestysnumero]; tässä on joitain rinnakkaisia argumentteja sen käyttöä vastaan:
Vastaus
MySQL: n avulla voit tehdä GROUP BY
aliaksilla ( Ongelmia sarakkeiden aliaksilla ). Tämä olisi paljon parempi kuin tekemällä GROUP BY
numeroilla.
- Jotkut ihmiset silti opettavat sitä
- Joillakin on
column number
SQL-kaavioissa . Yksi rivi sanoo: Lajittelee tuloksen annetun sarakkeen numeron tai lausekkeen perusteella. Jos lauseke on yksi parametri, arvo tulkitaan sarakkeen numerona. Negatiiviset sarakkeiden numerot kääntävät lajittelujärjestyksen. - Apache on vanhentanut käyttöä, koska SQL Server on
Googlella on monia esimerkkejä sen käytöstä ja miksi monet ovat lopettaneet sen käytön.
Ollakseni rehellinen kanssasi, en ole käyttänyt sarakkeiden numeroita sarakkeille ORDER BY
ja GROUP BY
vuodesta 1996 (tein tuolloin Oracle PL / SQL -kehitystä). Sarakkeiden numeroiden käyttö on todella vanhaa ajastinta varten ja taaksepäin yhteensopivuus antaa tällaisten kehittäjien käyttää MySQL: ää ja muita RDBMS: itä silti salli se.
Vastaa
Harkitse seuraavaa tapausta:
+------------+--------------+-----------+ | 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 | +------------+--------------+-----------+
Olet löytänyt selvityksen päivittäisten latausten määrästä palvelua kohti ottaen huomioon, että sovellukset ja sovellukset ovat sama palvelu. Ryhmittely date, services
mukaan johtaisi siihen, että Apps
ja Applications
katsotaan erillisiksi palveluiksi.
Tällöin kysely olisi:
select date, services, sum(downloads) as downloads from test.zvijay_test group by date,services
Ja tulos:
+------------+--------------+-----------+ | 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 | +------------+--------------+-----------+
Mutta tätä et halua, koska vaatimus on, että Sovellukset ja sovellukset ryhmitellään. Joten mitä voimme tehdä?
Yksi tapa on korvata Apps
sanalla Applications
käyttämällä CASE
-lauseke tai IF
-funktio ja ryhmittelemällä ne sitten palvelujen yli seuraavasti:
select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,services
Mutta tämä ryhmittelee palvelut silti, kun Apps
ja Applications
pidetään eri palveluina ja annetaan sama lähtö kuin aiemmin:
+------------+--------------+-----------+ | 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 | +------------+--------------+-----------+
Ryhmittely sarakkeen numeron yli antaa sinun ryhmittää tietoja aliaksisarakkeeseen.
select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,2;
Ja näin saat haluamasi tuloksen seuraavasti:
+------------+--------------+-----------+ | 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 lue monta kertaa, että tämä on laiska tapa kirjoittaa kyselyitä tai ryhmittely aliaksisen sarakkeen päälle ei toimi MySQL: ssä, mutta tämä on tapa ryhmittyä aliaksia sisältävien sarakkeiden yli.
Tämä ei ole ensisijainen tapa kirjoittaa kyselyitä, käytä sitä vain silloin, kun sinun on todella ryhmiteltävä aliaksinen sarake.
Kommentit
- " Tämä kuitenkin ryhmitelee palvelut, joissa sovellukset ja sovellukset otetaan huomioon eri palveluina, ja antaa saman tuotoksen kuin aiemmin ".Eikö ' t ratkeaisi tämä, jos ' valitsit aliakselle eri (ristiriitaisen) nimen?
- @ Daddy32 Tarkalleen ajatukseni. Tai jopa pesää vielä kerran (ryhmä valinnan jälkeen)
Vastaa
Ei ole mitään pätevää syytä käyttää sitä. Se on yksinkertaisesti laiska pikakuvake, joka on erityisesti suunniteltu vaikeuttamaan jonkun kovan kehityksen omaavaa kehittäjää selvittämään ryhmittelysi tai lajittelusi myöhemmin tai antamaan koodin epäonnistua surkeasti, kun joku muuttaa sarakejärjestystä. Ole huomaavainen muille kehittäjille ja älä tee sitä.
Vastaa
Tämä toimii minulle. Koodi ryhmittää riviä enintään 5 ryhmään.
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
Tulos on seuraava
Vastaa
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;
Harkitse yllä olevia kyselyitä: Ryhmittele 1 tarkoittaa ryhmittelyä ensimmäisen sarakkeen mukaan ja ryhmitellä 1,2 tarkoittaa ryhmittelyä ensimmäisen ja toisen sarakkeen mukaan ja ryhmittely 1,2,3 tarkoittaa ryhmittelyä ensimmäisessä toisessa ja kolmannessa sarakkeessa. Esimerkki:
tämä kuva näyttää kaksi ensimmäistä saraketta ryhmiteltyinä 1,2: lla, ts. se ei ota huomioon dep_date: n eri arvoja laskennan löytämiseksi (laskennan laskemiseksi otetaan huomioon kahden ensimmäisen sarakkeen kaikki erilliset yhdistelmät) kun taas toinen kysely tuottaa tämän
. Tässä se tarkastelee kaikkia kolmea ensimmäistä saraketta ja siellä on erilaisia arvoja laskurin löytämiseksi, ts. Se ryhmitellään kaikkien kolmen ensimmäisen sarakkeen mukaan (laskennan laskemiseksi otetaan huomioon kaikki kolmen ensimmäisen sarakkeen erilliset yhdistelmät).
order by 1
vain istuessasimysql>
-kehotteessa. Käytä koodissaORDER BY id ASC
. Huomaa tapaus, nimenomainen kentän nimi ja selkeä järjestyssuunta.