Iz knjige Rukovanje bazama podataka sa Visual Basic® .NET autor McManus Geoffrey P

Funkcija SUM Vaše mogućnosti sumiranja nisu ograničene na jednostavno brojanje zapisa. Koristeći funkciju SUM, možete generirati rezultate sažetka za sve vraćene zapise za bilo koja numerička polja. Na primjer, za kreiranje upita koji generira ukupne vrijednosti za

Iz Kratkog vodiča za dizajnera knjiga fikcije autor autor nepoznat

Od dizajnera beletristike 3.2. Brzi vodič autor Izekbis

Funkcija uni() Pronalaženje/zamjena znaka njegovim unicode brojem također se može obaviti pomoću funkcije uni() Primjer uni() funkcije: Boouni(107,32)Dizajner će pronaći riječ Knjiga

Iz knjige UNIX: Procesna interakcija autor Stephens William Richard

pthread_rwlock_init funkcija Prva funkcija, pthread_rwlock_init, dinamički inicijalizira zaključavanje čitanja i pisanja. Njegov tekst je prikazan u Listingu 8.2.7-8. Dodjela atributa nije podržana sa ovom funkcijom, tako da provjeravamo da je attr pokazivač null.9-19 Mi

Iz XSLT knjige autor Holzner Stephen

Listing funkcije sem_open 10-22 prikazuje tekst funkcije sem_open, koja kreira novi semafor ili otvara postojeći. Listing 10-22. Funkcija sem_open//my_pxsem_fifo/sem_open.c1 #include "unpipc.h"2 #include "semaphore.h"3 #include /* za listu proizvoljnih argumenata */4 mysem_t *5 mysem_open(const char *pathname, int

Iz knjige XSLT Technology autor Valikov Aleksej Nikolajevič

Funkcija sem_close Tekst funkcije sem_close prikazan je u Listingu 10.23.11-15 Zatvaramo obje ručke i oslobađamo memoriju dodijeljenu tipu sem_t. Listing 10.23. Funkcija sem_close//my_pxsem_fifo/sem_close.s1 #include "unpipc.h"2 #include "semaphore.h"3 int4 mysem_close(mysem_t *sem)5 (6 if (sem->sem_magic != SEM_MAGIC =) (7 erno

Iz knjige PGP: Kodiranje i šifriranje informacija javnog ključa. autor Levin Maxim

concat() Funkcija concat spaja sve nizove koji su joj proslijeđeni i vraća rezultujući string: concat(string string1, string string2, ...) koji

Od dizajnera beletristike 3.2. Vodič za kreiranje knjige autora

Iz knjige Uvod u kriptografiju autor Philipp Zimmermann

Iz knjige Opis jezika PascalABC.NET autor RuBoard Team

Iz knjige autora

Iz knjige autora

Iz knjige autora

hash funkcija. Još jedna važna prednost korištenja PGP-a je ta što PGP koristi takozvanu "hash funkciju", koja radi na način da će u slučaju bilo kakve promjene informacije, makar i za jedan bit, rezultat "hash funkcije" biti potpuno

Iz knjige autora

Funkcija uni() Pronalaženje/zamjena znaka njegovim unicode brojem također se može obaviti pomoću funkcije uni() Primjer uni() funkcije: Boouni(107,32)Dizajner će pronaći riječ Knjiga

Iz knjige autora

Hash funkcija Međutim, gore opisana shema ima niz značajnih nedostataka. Izuzetno je spor i proizvodi previše podataka - najmanje dvostruko više od originalne informacije. Poboljšanje takve šeme je uvod u proces transformacije

Iz knjige autora

Metoda Concat Opis metodaDate su metode za sekvencu sekvence T. funkcija Concat(druga: sekvenca od T): sekvenca od T; Spaja dvije sekvence dodavanjem druge na kraj prve i vraćanjem rezultata


objavljivanje ovog članka dozvoljeno je samo uz vezu na stranicu autora članka

GROUP_CONCAT() u MySQL.
Danas želim govoriti o zanimljivoj funkciji u Mysql-u.
Kako se ispostavilo, vrlo malo programera to zna, ne znam zašto ga malo ljudi koristi, ali intervjuirao sam desetak svojih prijatelja i manje od polovine zna za GROUP_CONCAT.
Ova funkcija radi ovako CONCAT_WS(Konkatenira nizove sa graničnikom), samo za razliku od CONCAT_WS mogu kombinirati rezultate odabira iz tabele.

Sintaksa
GROUP_CONCAT( expr [,expr ...]
[,col_name ...]]
)

Dozvolite mi da vam navedem uobičajen primjer sa kućnim ljubimcima.
Na primjer, postoji tabela u kojoj je svakoj osobi dodijeljena životinja koju ima.

CREATE TABLE `test` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(250) NOT NULL, # je ime osobe
`pet` varchar(250) NOT NULL, # ovo je kućni ljubimac
PRIMARNI KLJUČ (`id`)
);

Podaci u tabeli su ovakvi
masha - papagaj
svjetlo - kat
masha - hrčak
Julia - pas
svjetlo - pas
masha - riba

Iz ove tabele se to vidi
Maša ima papagaja, hrčka i ribu,
Sveta ima mačku i psa,
A Julia ima samo psa.
Dakle, postoji zadatak prikazati sve ljude sa stola i tako da pored svakog bude prikazano koje životinje ima.

Postavimo ovakav zahtjev
SELECT `ime`, GROUP_CONCAT(`ljubimci`) kao `ljubimci`
IZ `testa`
GROUP BY `name`

Rezultat je ovakav
Maša - papagaj, hrčak, riba
svjetla - mačka, pas
Julia - pas

Ispostavilo se sjedinjenje svih životinja svake osobe.
GROUP BY `name` na kraju, grupiše identična imena, moglo bi se reći da odbacuje duplikate.

Naravno, primjer nije od vitalnog značaja, takvi suvišni podaci se ne nalaze često, obično su imena pohranjena u jednoj tabeli, životinje u drugoj, a linkovi u trećoj tabeli.
To je samo za takav slučaj i biće korisno GROUP_CONCAT().
Navest ću primjer sa ugniježđenim upitom.


(odaberite GROUP_CONCAT(`kućni ljubimac`) kao `kućni ljubimac` iz `testa` gdje je `ime` = `ime1`) kao `kućni ljubimac`
IZ `testa`

Ovaj primjer koristi ugniježđeni odabir za kreiranje kombiniranog okvira za životinje...
DISTINCT odbacuje identična imena. Polje ime preimenujemo ga tako da se može ispravno adresirati u ugniježđenom upitu.
Ovaj primjer je već više kao primjer iz života.
Prikazuju se imena, odbacujući identična, za svako ime se izvlači lista životinja.
Sve je vrlo jednostavno. Ne morate dobiti svako ime, a zatim povući životinje za svako ime, sve se radi u jednom zahtjevu.

A sada više o ovoj škakljivoj GROUP_CONCAT.

Separator.
Zadani razdjelnik je zarez.
Ako je potrebno, možete odrediti drugi separator

SELECT DISTINCT `name` kao `name1`,
(odaberite GROUP_CONCAT(`kućni ljubimac` SEPARATOR "::") kao `kućni ljubimac` iz `testa` gdje je `ime` = `ime1`) kao `kućni ljubimac`
IZ `testa`

Sada životinje neće biti odvojene zarezom, već dvotočkom ( :: )

A ostale mogućnosti ove funkcije su jasne iz opisane sintakse (sortiranje i isključivanje identičnih zapisa).

Nekoliko razočarenja.

Limit 1024.
Ova funkcija ima ograničenje količine izlaznih podataka.
Podrazumevano je 1024 karaktera po konkatenaciji - po izlaznoj liniji.
Ako je veličina zalijepljenih podataka veća, tada će biti skraćeni.
Da biste proširili veličinu, morate pokrenuti naredbu SET group_concat_max_len =4096;
Ako imate privilegije, tada ćete proširiti količinu primljenih podataka na 4096 i više.
Ali najčešće na redovnom hostingu nema takvih privilegija.

Samo tekst.
Next Feature GROUP_CONCAT radi samo sa žicama.
Ako želite spojiti brojeve, onda nećete uspjeti, morate broj pretvoriti u tekst.

Recimo da ne želite da dobijete životinje, već listu ličnih dokumenata.
Uobičajena opcija neće raditi, potrebno je konvertirati broj u tekst, na primjer ovako

SELECT DISTINCT `name` kao `name1`,
(odaberite CONVERT(GROUP_CONCAT(`id`) USING cp1251) iz `test` gdje je `name` = `name1`) kao `pet_id`
IZ `testa`

Evo pregleda jedne zanimljive karakteristike GROUP_CONCAT().
Najbolje ga je koristiti za informaciju, ne treba se oslanjati na činjenicu da ćete dobiti apsolutno sve podatke, jer može biti više podataka nego što je postavljeno u limitu.
Na primjer, na stranici prikazujete listu proizvoda.
Svaki artikl ima cijenu, dostupnost, težinu i kratak opis. I ovdje možete, na primjer, pokazati za svaki proizvod u kojim bojama je ovaj proizvod dostupan.
Budući da je na ovoj stranici prikazano dosta proizvoda, dodatne informacije o proizvodu treba prikazati sažeto, a ovdje možete ubaciti informaciju u kojim bojama je proizvod prisutan. Prikažite na primjer 5 najpopularnijih boja ovog proizvoda.
Očigledno, ako je 20 proizvoda prikazano na stranici, onda nikada nećete prikazati informacije o bojama većim od 1024 karaktera za svaki proizvod, nema smisla ponovno učitavati stranicu.
Ovdje na takvim mjestima ima smisla koristiti GROUP_CONCAT().

Komentari

27.11.2008 Eugene
Nije loša hladnoća

07.12.2008 Viola
Odlična prilika. Znao sam za to, ali nisam znao da postoji ograničenje. Samo nije jasno zašto pretvarati u tekst? Dobio sam samo listu ID-ova i nema konverzije.

07.12.2008 Vadim
Viola, vaše lične karte moraju biti pohranjene u tekstualnim poljima.
Ako polje u bazi ima numerički tip, onda ova funkcija neće prikazati ništa bez konverzije... Mora se pretvoriti u tekst.

07.12.2008 Viola
Ne, imao sam ID polje - int (11), auto-inkrement, primarni ključ. Možda je činjenica da nakon odabira radim implicitnu konverziju u tekst - prilijepim rezultat za string. Ali u samom odabiru nema ništa slično i vraća traženi rezultat.

24.12.2008 Vadim
Pa, teško je reći u čemu je problem, možda je to samo zbog vaših implicitnih konverzija...
Ali sam sam provjerio tri različite verzije mysql-a i potrebno je konvertirati u tekst, inače ne daje vrijednost, već neke informacije o polju.

24.02.2009. Sergio
Viola govori stvar, i ja normalno ispisujem Int. Verzija 5.1

24.04.2009. Gumer
HVALA!!!

Bilo je veoma potrebno.

16.06.2009. Nigina
Imam grešku, iako sam sve ispravno kopirao ;)

18.10.2009. tyman8992
mysql 5.0.51b, InnoDB tabela - potrebna je INT(11) konverzija, upravo provjereno.

21.10.2009 Artur
Hvala ti.
Pokazalo se da se rezultat prikazuje u formatu sličnom pivot tablici u Excelu.

21.12.2009 Semyon
Usput, postoji još jedna karakteristika.
Rezultat sindikata ne može biti veći od 255. Ovo je tužno :(

21.12.2009 admin
255 nije dovoljno, možda 1024?

19.01.2010
m možete spojiti više polja i umetnuti graničnik
na primjer radi dobro
odaberite msisdn, group_concat(week,"=",naplata redoslijeda po sedmicama) iz y2009 grupe po msisdn
380xxxxxxxxxx 40=8.41=4.44=8.45=8.46=4.47=1.50=8.51=9.52=4.53=1

03/09/2010 Dmitry
Ali ne mogu dobiti upit

SELECT product.id,title, catid, GROUP_CONCAT(`idSpecific`) AS `specific`
IZ `proizvoda`
LEFT JOIN `specification_items` ON ​​product.id = idProduct
WHERE catid =46 GRUPA PO naslovu

Specifičan rezultat

03/09/2010 admin
ova funkcija radi samo sa stringovima.
a u Vašem slučaju najvjerovatnije postoji obrada broja.
morate ovako konvertovati podatke
CONVERT(GROUP_CONCAT(`idSpecific`) UPOTREBA cp1251)

24.03.2010. Dmitry
Hvala puno preobraćeni :)

25.03.2010 AJ
Postoji li način da se izbjegnu ugniježđeni odabiri? ako trebate prikazati nekoliko stotina (hiljada) zapisa u upitu, to će biti isti broj ugniježđenih upita.

26.03.2010 Victor
Ali zar nije moguće izbjeći ugniježđene odabire kroz JOIN?
iako spoj vjerojatno neće pomoći ovdje, pošto je mnogo redova odabrano u jednom upitu ...
vjerovatno bez ugnijezdenog selekta to ne bi napravio.

24.05.2010. USVR
Nice feature! Pomogao je da se izbjegne pronalazak bicikla i njegova vlastita serijalizacija.

Za AJ, I ovdje, šta god da se kaže, potreban je potupit. Pitanje je samo ko će izvršiti ovaj podzahtjev - klijent ili server. Naravno, upotreba termina "podupita" nije sasvim tačna, nisam siguran, ali najvjerovatnije će na serveru postojati samo jedan odabir podupita odjednom za cijeli eksterni zahtjev, što je nemoguće implementirati na klijent.
Kakva šteta što postoji ograničenje. Općenito je besmislen i opravdan samo kao mjera zaštite od nečega (Buffer overflow?).

24.05.2010. USVR
Verovatno pogrešno izrazio
Optimizacija je moguća na serveru (ovo je suština svih agregatnih funkcija).
Ne znam tačno kako je ova funkcija optimizovana, ali očigledno zahteva manje resursa od obrade podataka u klijentu.

Funkcija Concat (Str1,Str2,...,StrN) spaja (ili spaja) nizove Str1,Str2,...,StrN redoslijedom kojim su specificirani u listi parametara. Zbir znakova svih spojenih nizova ne smije biti veći od 255.

Program DemoFunctionConcat; VarWord:string; Riječ1, Riječ2: string; Započnite Word1:= "kompanije"; Word2:="Microsoft"; Word:= Concat("Računari ",Word1,Word2); writeln(Riječ); (prikazuje se tekst "Microsoft Computers") Kraj.

Zadaci za samostalno rješavanje

    Navedena je imenica prve deklinacije koja završava na “a”. Provjerite je li unos ispravan. Ispišite ovu riječ u svim slučajevima. Primijeniti potprograme.

    Provjerite pravopis "cha" i "cha" u tekstu. Odštampajte broj napravljenih grešaka i ispravljenu liniju. Primijeniti potprograme.

    Napišite algoritam koji broji koliko puta se data riječ y pojavljuje u datoj riječi x. Ako je riječ y duža od x, onda rezultat mora biti nula. Primijeniti potprograme.

    Saznajte koliko se puta svako slovo abecede pojavljuje u datom tekstu. Primijeniti potprograme.

    Napišite red a obrnutim redoslijedom od reda b. Prebrojite koliko je identičnih slova na istim mjestima u ovim redovima. Primijeniti potprograme.

    Navodi se prezime, ime i patronimija učenika, odvojeno razmakom. Odštampajte njegovo prezime i inicijale. Primijeniti potprograme.

    Provjerite pravopis "zhi" i "shi" u tekstu. Odštampajte broj napravljenih grešaka i ispravljenu liniju. Primijeniti potprograme.

    Zatražite prilagođenu ponudu i ime. Potražite pravopisne greške i ispravite ih. Odštampajte broj napravljenih grešaka i ispravljenu liniju. Primijeniti potprograme.

    Izbrojite broj cifara u datom nizu znakova. Primijeniti potprograme.

    Izbrojite broj slova u unesenom nizu znakova. Primijeniti potprograme.

Upitajte više znakova i niz da biste saznali koliko se datih znakova pojavljuje u nizu. Primijeniti potprograme.

Standardne procedure za rad sa stringovima (delete, insert, str, val).

Procedura Umetanje

Procedura Insert umeće drugi niz u izvorni niz, počevši od navedene pozicije. Naredba Insert (Word1,Word2,5) specificira da string Word1 treba umetnuti u string Word2, počevši od 5. pozicije.

Delete Procedure

Procedura Delete uklanja fragment određene dužine iz izvornog niza, počevši od navedene pozicije. Dakle, operator Delete(Word1,2,3) uklanja fragment od tri znaka iz navedenog niza, počevši od drugog.

Procedura Str

Opšti pogled na ulicu (Chislo,Stroka)

Procedura Str pretvara numeričku vrijednost Chislo varijable u string varijablu Stroka. Prvi parametar može biti praćen formatom sličnim izlaznom formatu.

Program DemoProcedureStr; VarWord:string; broj: cijeli broj; Početni broj:= 1560; Str(Broj:8, Riječ); writeln(Riječ); (prikazuje se niz "1500") Kraj.

ProceduraVal

Opći oblik Val(Stroka,Chislo,Šifra)

Val procedura pretvara vrijednost Stroka u cijeli broj ili realnu vrijednost i stavlja rezultat u Chislo. Vrijednost string varijable Stroka ne smije sadržavati razmake na početku i na kraju. Kod je cjelobrojna varijabla. Ako se tokom operacije konverzije ne pronađe greška, vrijednost Code je nula; ako se pronađe greška, Code će sadržavati broj pozicije prvog znaka greške, a vrijednost Chislo će biti nedefinirana.

Program DemoProcedureVal; VarWord:string; Broj, kod: cijeli broj; Begin writeln("Unesite niz brojeva"); readln(Riječ); Val(Riječ, Broj, Šifra); (pretvori niz u broj) ako je kod<>0 then writeln("Greška! Pozicija ",Šifra," nije broj!",); kraj.

Omogućava vam spajanje nizova. Poziv funkcije izgleda ovako:

concat(s 1 ,s 2 ,…,s n)

Primjer 6.9. Program za spajanje dva niza.

program prog6_9;

koristi wincrt;

s:=koncat(s1,s2);

postupak umetanja

Umeće string unutar niza. Poziv procedure izgleda ovako:

insert(st1,st2,n)

gdje je st1 niz koji se ubacuje

st2 - linija u koju je umetnuta linija st1

n je pozicija sa koje počinje umetanje.

Primjer 6.10. Program za umetanje stringa u string.

program Prog6_10;

koristi wincrt;

insert(st1,st2,n);

Procedura Str

Omogućava vam da pretvorite brojeve u niz. Poziv procedure izgleda ovako:

str( Broj,st);

gdje je st string konstanta ili varijabla koja sadrži sliku broja;

Broj - promenljiva, numerička vrednost se konvertuje u niz i dodeljuje promenljivoj st;

Primjer 6.11. Program za pretvaranje broja u niz.

program Prog6_11;

koristi WinCrt;

readln(n); (unos broja)

str(n,st); (konverzija broja n niz)

writeln("broj slika =",st);

Kontrolna pitanja

1. Šta je string?

2. Koji identifikator definira podatke tipa niza?

3. Koja je maksimalna moguća dužina žice? Kako odrediti struju

dužina žice?

4. Koji se izrazi nazivaju string?

5. Koje su operacije dozvoljene nad podacima u nizu?

6. Kako se upoređuju žice?

7. Koji su zahtjevi za pisanje izraza sa operandima

string i literalni tip?

8. Kako možete pristupiti pojedinačnim znakovima u nizu?

9. Svrha posebnih procedura i funkcija obrade podataka

string type. Navedite primjere. \

Rad sa bazama podataka je stalno povezan sa dobijanjem rezultata upita. A u nekim slučajevima, ove informacije moraju biti prikazane na određeni način ili kombinovane s drugim podacima. Za rješavanje ovog problema postoji SQL funkcija - CONCAT.

Šta radi funkcija CONCAT?

Prilikom obavljanja nekog posla sa, postoji potreba za povezivanjem redova sa dodatnim podacima ili međusobno. Za rješavanje ovog problema postoji SQL funkcija - CONCAT. Kada ga koristite, dvije ili više linija će se kombinirati u jednu. U ovom slučaju, operacija konkatenacije nizova će biti ispravno izvedena i kada se radi sa stringovima i sa numeričkim varijablama.

U nekim bazama podataka, SQL CONCAT ima nekoliko vrsta. Dakle, u MySQL-u ima svoj analog - CONCAT_WS. Razlika između funkcija nije značajna: u slučaju prve, kada se kombinuje s argumentom čija je vrijednost NULL, rezultat konkatenacije će biti NULL, a kada se koristi druga varijanta unije, nulti operand će jednostavno biti preskočen.

Sintaksa funkcije

Kada se koristi funkcija CONCAT, SQL sintaksa obvezuje programera da koristi argumente redoslijedom kojim se operandi trebaju spojiti. Sintaksa same operacije konkatenacije nizova je prilično jednostavna: nakon ključne riječi CONCAT svi potrebni argumenti ili nizovi su navedeni u zagradama odvojenim zarezima, a nakon zagrade, ako je potrebno, ključna riječ AS i naziv varijable gdje je rezultat će biti napisan su naznačeni. Predložak funkcije CONCAT izgleda ovako:

CONCAT (red1, red2 [, red3, ...]) .

Vrijedi napomenuti da se kao argumenti funkcije mogu koristiti i operand numeričke i string vrijednosti i neka funkcija koja vraća rezultat. Na primjer, sama operacija SQL CONCAT. Dakle, operacija podržava princip gniježđenja.

Kako bez upotrebe CONCAT-a?

U slučaju kada postoji potreba da se izbjegne korištenje operacije, ili programer nije svjestan funkcije CONCAT, SQL nudi drugu opciju za implementaciju konkatenacije nizova. Da biste to učinili, morate koristiti operator "+", ali ovaj pristup ima niz karakteristika koje se moraju uzeti u obzir pri radu s njim.

Kada koristite funkciju "+", ako su operandi numeričke vrijednosti, rezultat operacije će biti obično zbrajanje brojeva, a ako je potrebno, kombinirati broj sa nizom bez eksplicitne konverzije, program će generirati grešku. Dakle, kada se izvrši sljedeći upit, rezultat će biti vrijednost broja "6":

Inače, obje metode su identične i vraćaju isti rezultat.