Mysql implode, explode - blog de Vyacheslav Volkov

Știm cu toții despre caracteristicile mari, cum ar fi PHP implozie (combină elemente ale unei matrice într-un delimitator șir de caractere specificat) și exploda (împarte un șir de caractere într-o matrice de separator specificat).







Dar, uneori, dezvoltatorii trebuie să opereze pe un șir de caractere delimitat (date denormalized) sau invers - pentru a obține orice date, combinate cu un separator în baza de date. După cum sa dovedit, acest lucru nu este atât de ușor în MySQL. După un săpat puțin în documentația a arătat că pentru combinarea înregistrărilor într-un șir de caractere, puteți utiliza funcțiile GROUP_CONCAT. Implicit, delimitatorul este o virgulă (simbol ","). Dar poate fi modificat utilizând parametrul SEPARATOR. Iată un mic exemplu.

Să presupunem că avem un tabel cu o listă de utilizatori - "utilizatori". Din aceasta, trebuie să selectați toate ID-urile utilizatorilor și să le asamblați într-un șir delimitat.

Și câteva date umplute:

Mysql implode, explode - blog de Vyacheslav Volkov

Acum, executați următoarea interogare pentru a îmbina datele într-un șir:

Ca rezultat, obținem următorul set de date:

Acum combina datele prin simbolul „virgulă“ ( „“), care rulează următoarea interogare folosind parametrul SEPARATOR.







Drept urmare, proba a luat acest sens:

Deci, utilizând funcția GROUP_CONCAT, puteți îmbina orice date din baza de date printr-un separator. În plus, mai multe câmpuri pot fi transmise funcției pentru concatenare (lipire). Pentru a evita dublarea datelor, puteți utiliza parametrul DISTINCT.

Această funcție are o limitare a cantității de date de ieșire. Implicit, pentru fiecare linie de ieșire sunt 1024 de caractere pentru fiecare conexiune. Dacă dimensiunea datelor lipite este mai mare, atunci va fi tăiată. Pentru a extinde dimensiunea, trebuie să executați comanda (numai dacă aveți privilegiile necesare pentru a rula)

Prin consolidarea datelor cu privire la toate acestea. Dar asta ar fi să analizăm linia prin delimitator, acest lucru va trebui să dureze mai mult. Nu am găsit niciun suport nativ pentru acest lucru în MySQL. Singura soluție este să scrie o procedură stocată pentru parsarea unui șir.

Următoarea este o descărcare a procedurii stocate.

Procedura durează doar un parametru (de exemplu). Aceasta este o listă de valori separate printr-o virgulă. După aceasta se execută o buclă pe acest parametru și se caută un delimitator (în cazul nostru este o virgulă). Fiecare nouă valoare este stocată în variabila @sHead și poate fi deja utilizată pentru interogări SQL.

Pentru a apela procedura, folosiți următorul cod.

După aceasta, noile ID-uri de utilizator apar în tabel. Acesta este un exemplu destul de simplu. Cel mai adesea, folosesc astfel de operații pentru a stoca date denormalizate și normalizarea lor ulterioară (prin declanșatoare).

căutare Inutil se face pe date normalizate, dar dacă aveți nevoie doar pentru a aduce informații - ieșire denormalized.

Puteți schimba această procedură și o puteți utiliza deja pentru nevoile dvs.

Ați putea fi, de asemenea, interesat de:

  • Mysql implode, explode - blog de Vyacheslav Volkov
    Crearea doctrinei YAML prin intermediul Workbench-ului MySQL
  • Instalați Apache 2, PHP 5.3 și MySQL 5.1 pe ...






Articole similare

Trimiteți-le prietenilor: