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

  • Käytä order by 1 vain istuessasi mysql> -kehotteessa. Käytä koodissa ORDER BY id ASC. Huomaa tapaus, nimenomainen kentän nimi ja selkeä järjestyssuunta.

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.

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

kirjoita kuvan kuvaus tähän

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:

ryhmittele 1,2: lla

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 ryhmittele kuvan mukaan 1,2,3

. 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).

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *