Din cartea Handling Databases with Visual Basic® .NET autor McManus Geoffrey P

Funcția SUM Capacitățile dumneavoastră de rezumat nu se limitează la simpla numărare a înregistrărilor. Folosind funcția SUM, puteți genera rezultate rezumative pentru toate înregistrările returnate pentru orice câmpuri numerice. De exemplu, pentru a crea o interogare care generează totaluri pentru

De la Fiction Book Designer Quick Guide autor autor necunoscut

Din Fiction Book Designer 3.2. Ghid rapid autor Izekbis

Funcția uni() Găsirea/înlocuirea unui caracter cu numărul său unicode se poate face și folosind funcția uni() Un exemplu de funcție uni(): Boouni(107,32)Designer va găsi cuvântul Book

Din cartea UNIX: Process Interaction autor Stephens William Richard

Funcția pthread_rwlock_init Prima funcție, pthread_rwlock_init, inițializează dinamic o blocare de citire-scriere. Textul acestuia este prezentat în Lista 8.2.7-8.Atribuțiile de atribute nu sunt acceptate cu această funcție, așa că verificăm dacă pointerul attr este nul.9-19 Noi

Din cartea XSLT autor Holzner Stephen

Lista 10-22 a funcției sem_open arată textul funcției sem_open, care creează un nou semafor sau deschide unul existent. Funcția sem_open//my_pxsem_fifo/sem_open.c1 #include "unpipc.h"2 #include "semaphore.h"3 #include /* pentru o listă arbitrară de argumente */4 mysem_t *5 mysem_open(const char *pathname, int

Din cartea XSLT Technology autor Valikov Alexey Nikolaevici

Funcția sem_close Textul funcției sem_close este afișat în Lista 10.23.11-15 Închidem ambele mânere și eliberăm memoria alocată pentru tipul sem_t Lista 10.23. Funcția sem_close//my_pxsem_fifo/sem_close.с1 #include "unpipc.h"2 #include "semaphore.h"3 int4 mysem_close(mysem_t *sem)5 (6 if (sem->sem_magic != SEM_MAGIC) (7 errno =

Din cartea PGP: Encoding and Encrypting Public Key Information. autorul Levin Maxim

concat() Funcția concat concatenează toate șirurile transmise acesteia și returnează șirul rezultat: concat(șir șir1, șir șir2, ...) care

Din Fiction Book Designer 3.2. Ghidul de creare a cărții autorului

Din cartea Introducere în Criptografie autor Philipp Zimmermann

Din cartea Description of the PascalABC.NET Language autor Echipa RuBoard

Din cartea autorului

Din cartea autorului

Din cartea autorului

funcția hash. Un alt avantaj important al utilizării PGP este că PGP utilizează o așa-numită „funcție hash”, care funcționează în așa fel încât în ​​cazul oricărei modificări a informațiilor, chiar și cu un bit, rezultatul „funcției hash” va fi complet

Din cartea autorului

Funcția uni() Găsirea/înlocuirea unui caracter cu numărul său unicode se poate face și folosind funcția uni() Un exemplu de funcție uni(): Boouni(107,32)Designer va găsi cuvântul Book

Din cartea autorului

Funcția Hash Cu toate acestea, schema descrisă mai sus are o serie de dezavantaje semnificative. Este extrem de lent și produce prea multe date - cel puțin de două ori cantitatea de informații originale. O îmbunătățire a unei astfel de scheme este introducerea în procesul de transformare

Din cartea autorului

Metoda Concat Descrierea metodelor Metodele sunt date pentru secvența secvenței lui T. funcția Concat(a doua: secvența lui T): secvența lui T; Unește două secvențe adăugând a doua la sfârșitul primei și returnând rezultatul


publicarea acestui articol este permisă numai cu un link către site-ul autorului articolului

GROUP_CONCAT() în MySQL.
Astăzi vreau să vorbesc despre o caracteristică interesantă în Mysql.
După cum sa dovedit, foarte puțini programatori îl știu, nu știu de ce puțini oameni îl folosesc, dar mi-am intervievat o duzină de prieteni și mai puțin de jumătate știau despre GROUP_CONCAT.
Această funcție funcționează astfel CONCAT_WS(Concatenează șiruri cu un delimitator), doar spre deosebire de CONCAT_WS capabil să combine rezultatele unei selecții dintr-un tabel.

Sintaxă
GROUP_CONCAT( expr [,expr ...]
[,col_name ...]]
)

Permiteți-mi să vă dau un exemplu comun cu animalele de companie.
De exemplu, există un tabel în care fiecărei persoane i se atribuie animalul pe care îl are.

CREATE TABLE `test` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(250) NOT NULL, # este numele persoanei
`pet` varchar(250) NOT NULL, # acesta este un animal de companie
CHEIE PRIMARĂ (`id`)
);

Datele din tabel sunt astfel
masha - papagal
lumina - pisica
masha - hamster
Julia - câine
lumină – câine
masha - pește

Din acest tabel se poate observa că
Masha are un papagal, un hamster și un pește,
Sveta are o pisică și un câine,
Și Julia are doar un câine.
Așa că există o sarcină de a afișa toți oamenii de la masă și astfel încât lângă fiecare să se arate ce animale are.

Să facem o astfel de cerere
SELECTAȚI `nume`, GROUP_CONCAT(`animal de companie`) ca `animal de companie`
DIN `test`
GROUP BY `nume`

Rezultatul este cam acesta
Masha - papagal, hamster, pește
lumini - pisică, câine
Julia - câine

Sa dovedit unirea tuturor animalelor fiecărei persoane.
GROUP BY `nume` la sfârșit, grupează nume identice, s-ar putea spune că elimină duplicatele.

Desigur, exemplul nu este foarte vital, astfel de date redundante nu se găsesc des, de obicei numele sunt stocate într-un tabel, animalele în al doilea, iar linkurile în al treilea tabel.
Asta doar pentru un astfel de caz și va fi util GROUP_CONCAT().
Voi da un exemplu cu o interogare imbricată.


(selectați GROUP_CONCAT(`animal de companie`) ca `animal de companie` din `test` unde `nume` = `nume1`)ca `animal de companie`
DIN `test`

Acest exemplu folosește o selecție imbricată pentru a crea o casetă combinată de animale...
DISTINCT renunță la nume identice. Camp Numeîl redenumim astfel încât să poată fi adresat corect în interogarea imbricată.
Acest exemplu este deja mai mult ca un exemplu din viață.
Sunt afișate numele, aruncându-le pe cele identice, pentru fiecare nume este scoasă o listă de animale.
Totul este foarte simplu. Nu trebuie să obțineți fiecare nume și apoi să trageți animalele pentru fiecare nume, totul se face într-o singură cerere.

Și acum mai multe despre acest GROUP_CONCAT dificil.

Separator.
Separatorul implicit este virgula.
Dacă este necesar, puteți specifica un alt separator

SELECTARE DISTINCT `nume` ca `nume1`,
(selectați GROUP_CONCAT(`pet` SEPARATOR "::") ca `animal` din `test` unde `name` = `name1`) ca `animal`
DIN `test`

Acum animalele nu vor fi separate prin virgulă, ci prin două puncte ( :: )

Și restul posibilităților acestei funcții sunt clare din sintaxa descrisă (sortarea și excluderea înregistrărilor identice).

Mai multe dezamăgiri.

Limita 1024.
Această funcție are o limită a cantității de date de ieșire.
Valoarea implicită este de 1024 de caractere pe concatenare - pe linie de ieșire.
Dacă dimensiunea datelor lipite este mai mare, atunci acestea vor fi trunchiate.
Pentru a extinde dimensiunea, trebuie să rulați comanda SET group_concat_max_len =4096;
Dacă aveți privilegii, atunci veți extinde cantitatea de date primite la 4096 și mai mult.
Dar cel mai adesea pe găzduirea obișnuită nu există astfel de privilegii.

Doar text.
Următoarea caracteristică GROUP_CONCAT funcționează doar cu șiruri.
Dacă doriți să lipiți numerele împreună, atunci nu veți reuși, trebuie să convertiți numărul în text.

Să presupunem că doriți să obțineți nu animale, ci o listă de acte de identitate.
Opțiunea obișnuită nu va funcționa, trebuie să convertiți numărul în text, de exemplu astfel

SELECTARE DISTINCT `nume` ca `nume1`,
(selectați CONVERT(GROUP_CONCAT(`id`) FOLOSIND cp1251) din `test` unde `name` = `name1`) ca `pet_id`
DIN `test`

Iată o prezentare generală a unei caracteristici interesante GROUP_CONCAT().
Cel mai bine este să-l folosiți pentru informații, nu ar trebui să vă bazați pe faptul că veți primi absolut toate datele, deoarece pot exista mai multe date decât se stabilește în limită.
De exemplu, afișați o listă de produse pe pagină.
Fiecare articol are un preț, disponibilitate, greutate și o scurtă descriere. Și aici puteți, de exemplu, să arătați pentru fiecare produs în ce culori este disponibil acest produs.
Deoarece pe această pagină sunt afișate o mulțime de produse, prin urmare, informațiile suplimentare despre produs ar trebui să fie afișate concis, iar aici puteți strecura informații în ce culori este prezent produsul. Afișați, de exemplu, cele mai populare 5 culori ale acestui produs.
Evident, dacă pe pagină sunt afișate 20 de produse, atunci nu veți afișa niciodată informații despre culori mai mari de 1024 de caractere pentru fiecare produs, nu are rost să reîncărcați pagina.
Aici, în astfel de locuri, are sens să fie folosit GROUP_CONCAT().

Comentarii

27.11.2008 Eugene
Nu e un răcoare rău

07.12.2008 Viola
O mare oportunitate. Știam despre asta, dar nu știam că există o restricție. Nu este clar de ce convertirea în text? Am doar o listă de ID-uri și nicio conversie.

07.12.2008 Vadim
Viola, ID-urile tale trebuie să fi fost stocate în câmpuri de text.
Dacă câmpul din bază are un tip numeric, atunci această funcție nu va afișa nimic fără conversie... Trebuie convertit în text.

07.12.2008 Viola
Nu, am avut un câmp ID - int (11), auto-increment, cheie primară. Poate că, după selecție, fac o conversie implicită în text - agăț rezultatul de șir. Dar în selecția în sine nu există nimic de acest fel și returnează rezultatul dorit.

24.12.2008 Vadim
Ei bine, este greu de spus care este problema, poate asta se datorează doar conversiilor tale implicite...
Dar eu însumi am verificat trei versiuni diferite de mysql și este necesar să se convertească în text, altfel nu dă o valoare, ci câteva informații despre câmp.

24.02.2009 Sergio
Viola vorbește, de asemenea, scot Int normal. Versiunea 5.1

24.04.2009 Gumer
MULȚUMIRI!!!

A fost foarte necesar.

16.06.2009 Nigina
Am o eroare, desi am copiat totul corect;)

18.10.2009 tyman8992
mysql 5.0.51b, tabel InnoDB - este necesară conversia INT(11), tocmai a fost verificată.

21.10.2009 Artur
Mulțumesc.
S-a dovedit a afișa rezultatul într-un format similar cu un tabel pivot din Excel.

21.12.2009 Semyon
Pe parcurs, există o altă caracteristică.
Rezultatul unirii nu poate fi mai mare de 255. Este trist :(

21.12.2009 admin
255 nu este suficient, poate 1024?

19.01.2010
m puteți concatena mai multe câmpuri și puteți introduce un delimitator
de exemplu merge bine
selectați msisdn, group_concat(week,"=",comandă de încărcare pe săptămână) din y2009 group by 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 Dmitri
Dar nu pot primi interogarea

SELECT product.id,title, catid, GROUP_CONCAT(`idSpecific`) AS `specific`
DE LA `produs`
LEFT JOIN `specification_items` ON ​​​​product.id = idProduct
WHERE catid =46 GROUP BY titlu

Specific rezultat

03/09/2010 admin
această funcție funcționează numai cu șiruri.
iar în cazul dvs. cel mai probabil există o procesare a numărului.
trebuie să convertiți datele astfel
CONVERTĂ(GROUP_CONCAT(`idSpecific`) FOLOSIND cp1251)

24.03.2010 Dmitri
Multumesc mult convertit :)

25.03.2010 AJ
Există vreo modalitate de a evita selectările imbricate? dacă trebuie să afișați câteva sute (mii) de înregistrări într-o interogare, va fi același număr de interogări imbricate.

26.03.2010 Victor
Dar nu este posibil să evitați selectările imbricate prin JOIN?
deși alăturarea probabil nu va ajuta aici, deoarece multe rânduri sunt selectate într-o singură interogare...
probabil fără selecta imbricată să nu-l facă.

24.05.2010 USVR
Frumoasă caracteristică! A ajutat la evitarea inventării bicicletei și a propriei sale serializări.

Pentru AJ, Și aici, orice s-ar spune, este necesară o subinterogare. Singura întrebare este cine va efectua această subcerere - clientul sau serverul. Desigur, utilizarea termenului „subinterogare” nu este în întregime corectă, nu sunt sigur, dar cel mai probabil pe server va exista o singură selecție a subinterogării simultan pentru întreaga cerere externă, ceea ce este imposibil de implementat pe server. client.
Ce păcat că există o limitare. În general, este lipsit de sens și justificat doar ca măsură de protecție împotriva a ceva (Buffer overflow?).

24.05.2010 USVR
Probabil a exprimat-o greșit
Optimizarea este posibilă pe server (aceasta este esența tuturor funcțiilor agregate).
Nu știu exact cum este optimizată această funcție, dar, evident, necesită mai puține resurse decât procesarea datelor în client.

Funcția Concat (Str1,Str2,...,StrN) concatenează (sau concatenează) șirurile Str1,Str2,...,StrN în ordinea în care sunt specificate în lista de parametri. Suma caracterelor tuturor șirurilor concatenate nu trebuie să depășească 255.

Program DemoFunctionConcat; VarWord:șir; Cuvânt1, Cuvânt2: șir; Begin Word1:= „companii”; Word2:="Microsoft"; Cuvânt:= Concat(„Computere”, Cuvânt1, Cuvânt2); writeln(Cuvânt); (este afișat textul „Microsoft Computers”) Sfârșit.

Sarcini pentru soluție independentă

    Este dat un substantiv de prima declinare care se termină în „a”. Verificați dacă introducerea este corectă. Tipăriți acest cuvânt în toate cazurile. Aplicați subrutine.

    Verificați ortografia „cha” și „cha” în text. Tipăriți numărul de erori făcute și linia corectată. Aplicați subrutine.

    Scrieți un algoritm care numără de câte ori apare un anumit cuvânt y într-un anumit cuvânt x. Dacă cuvântul y este mai lung decât x, atunci rezultatul trebuie să fie zero. Aplicați subrutine.

    Aflați de câte ori apare fiecare literă a alfabetului în textul dat. Aplicați subrutine.

    Scrieți rândul a în ordine inversă rândului b. Numărați câte litere identice sunt în aceleași locuri în aceste rânduri. Aplicați subrutine.

    Sunt date numele de familie, prenumele și patronimul elevului, separate printr-un spațiu. Tipăriți-i numele de familie și inițialele. Aplicați subrutine.

    Verificați ortografia „zhi” și „shi” în text. Tipăriți numărul de erori făcute și linia corectată. Aplicați subrutine.

    Solicitați o ofertă personalizată și un nume. Căutați greșelile de ortografie și corectați-le. Tipăriți numărul de erori făcute și linia corectată. Aplicați subrutine.

    Numărați numărul de cifre din șirul de caractere dat. Aplicați subrutine.

    Numărați numărul de litere din șirul de caractere introdus. Aplicați subrutine.

Interogați mai multe caractere și un șir pentru a afla câte dintre caracterele date apar într-un șir. Aplicați subrutine.

Proceduri standard pentru lucrul cu șiruri de caractere (ștergere, inserare, str, val).

Procedură Inserare

Procedura Insert inserează un alt șir în șirul sursă, începând de la poziția specificată. Instrucțiunea Insert (Word1,Word2,5) specifică că șirul Word1 trebuie inserat în șirul Word2, începând cu a 5-a poziție.

Procedura de ștergere

Procedura Delete elimină un fragment de o anumită lungime din șirul sursă, începând de la poziția specificată. Astfel, operatorul Delete(Word1,2,3) elimină un fragment de trei caractere din șirul specificat, începând cu al doilea.

Procedura Str

Vedere generală a Str (Chislo, Stroka)

Procedura Str convertește valoarea numerică a variabilei Chislo în variabila șir Stroka. Primul parametru poate fi urmat de un format similar cu formatul de ieșire.

Program DemoProcedureStr; VarWord:șir; număr: întreg; BeginNumber:= 1560; Str(Număr:8, Cuvânt); writeln(Cuvânt); (este afișat șirul " 1500 ") Sfârșit.

ProcedurăVal

Forma generală Val(Stroka,Chislo,Code)

Procedura Val convertește valoarea unui Stroka într-un număr întreg sau valoare reală și plasează rezultatul în Chislo. Valoarea variabilei șir Stroka nu trebuie să conțină spații la început și la sfârșit. Codul este o variabilă întreagă. Dacă nu este găsită nicio eroare în timpul operației de conversie, valoarea Codului este zero; dacă este găsită o eroare, Codul va conține numărul de poziție al primului caracter de eroare, iar valoarea Chislo va fi nedefinită.

Program DemoProcedureVal; VarWord:șir; Număr, Cod: întreg; Begin writeln("Introduceți un șir de numere"); readln(Cuvânt); Val(Cuvânt, Număr, Cod); (conversia șir în număr) dacă Cod<>0 apoi writeln("Eroare! Poziția ",Cod," nu este un număr!",); Sfârşit.

Vă permite să uniți șiruri. Apelul funcției arată astfel:

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

Exemplul 6.9. Un program pentru unirea a două șiruri.

program prog6_9;

utilizări wincrt;

s:=concat(s1,s2);

procedura de inserare

Inserează un șir într-un șir. Apelul procedurii arată astfel:

insert(st1,st2,n)

unde st1 este șirul de inserat

st2 - linia în care este inserată linia st1

n este poziția de la care începe inserția.

Exemplul 6.10. Un program pentru inserarea unui șir într-un șir.

program Prog6_10;

utilizări wincrt;

insert(st1,st2,n);

Procedura Str

Vă permite să convertiți numerele într-un șir. Apelul de procedură arată astfel:

str( Număr,st);

unde st este o constantă sau variabilă șir care conține o imagine a unui număr;

Număr - variabilă, valoarea numerică este convertită într-un șir și atribuită variabilei st;

Exemplul 6.11. Un program pentru a converti un număr într-un șir.

program Prog6_11;

utilizări WinCrt;

readln(n); (introducerea numărului)

str(n,st); (conversie număr n șir)

writeln("număr imagine =",st);

Întrebări de control

1. Ce este o sfoară?

2. Ce identificator definește datele de tip șir?

3. Care este lungimea maximă posibilă a șirului? Cum se determină curentul

lungimea coardei?

4. Ce expresii se numesc șir?

5. Ce operațiuni sunt permise asupra datelor șir?

6. Cum se compară șirurile?

7. Care sunt cerințele pentru scrierea expresiilor cu operanzi

șir și tip literal?

8. Cum puteți accesa caracterele individuale dintr-un șir?

9. Scopul procedurilor speciale și al funcțiilor de prelucrare a datelor

tip șir. Dă exemple. \

Lucrul cu bazele de date este asociat în mod constant cu obținerea rezultatelor interogărilor. Și în unele cazuri, aceste informații trebuie să fie afișate într-un anumit mod sau combinate cu alte date. Pentru a rezolva această problemă, există o funcție SQL - CONCAT.

Ce face funcția CONCAT?

Când lucrați cu, este necesar să conectați rândurile cu date suplimentare sau între ele. Pentru a rezolva această problemă, există o funcție SQL - CONCAT. Când îl utilizați, două sau mai multe linii vor fi combinate într-una singură. În acest caz, operația de concatenare a șirurilor va fi efectuată corect atât la lucrul cu șiruri, cât și cu variabile numerice.

În unele baze de date, SQL CONCAT are mai multe variante. Deci, în MySQL are analogul său - CONCAT_WS. Diferența dintre funcții nu este semnificativă: în cazul primei, atunci când este combinată cu un argument a cărui valoare este NULL, rezultatul concatenării va fi NULL, iar la utilizarea celei de-a doua variante a uniunii, operandul zero va pur și simplu să fie omis.

Sintaxa funcției

Când se utilizează funcția CONCAT, sintaxa SQL obligă programatorul să folosească argumentele în ordinea în care operanzii urmează să fie concatenați. Sintaxa operației de concatenare a șirurilor în sine este destul de simplă: după cuvântul cheie CONCAT, toate argumentele sau șirurile necesare sunt specificate între paranteze separate prin virgule, iar după paranteza de închidere, dacă este necesar, cuvântul cheie AS și numele variabilei unde rezultatul va fi scris sunt indicate. Șablonul funcției CONCAT arată astfel:

CONCAT (line1, line2 [, line3, ...]) .

Este de remarcat faptul că atât un operand cu o valoare numerică și șir, cât și o funcție care returnează un rezultat pot fi folosite ca argumente ale funcției. De exemplu, operația SQL CONCAT în sine. Astfel, operațiunea susține principiul cuibării.

Cum să faci fără a folosi CONCAT?

În cazul în care este necesar să se evite utilizarea operației sau programatorul nu cunoaște funcția CONCAT, SQL oferă o altă opțiune pentru implementarea concatenării șirurilor. Pentru a face acest lucru, trebuie să utilizați operatorul „+”, dar această abordare are o serie de caracteristici care trebuie luate în considerare atunci când lucrați cu acesta.

Când utilizați funcția „+”, dacă operanzii sunt valori numerice, rezultatul operației va fi o adunare obișnuită de numere și, dacă este necesar, combinați un număr cu un șir fără conversie explicită, programul va genera o eroare. Deci, atunci când se execută următoarea interogare, rezultatul va fi valoarea numărului „6”:

În caz contrar, ambele metode sunt identice și returnează același rezultat.