Mysql implode, felrobban - Vyacheslav Volkov blogja

Mindannyian tudjuk a csodálatos PHP-funkciókat, például az implode-t (egy tömb elemeit egy meghatározott határolójú karakterláncba ötvözi) és felrobban (egy sztringet egy adott határolóba töri a tömbbe).

De néha a fejlesztőknek határolt vonallal (denormalizált adatok) kell működniük, vagy fordítva -, hogy adatokat gyűjtsenek az adatbázisban lévő elválasztó segítségével. Mint kiderült, ez nem olyan egyszerű a MySQL-ben. Egy kis ásás után a dokumentációban azt találták, hogy a GROUP_CONCAT függvényekkel kombinálhatja a rekordokat egy karakterláncba. Alapértelmezés szerint a határoló egy vessző ("," szimbólum). De a SEPARATOR paraméterrel megváltoztatható. Itt egy kis példa.

Tegyük fel, hogy van egy asztal a felhasználók listájával - "felhasználók". Erről az összes felhasználói azonosítót ki kell választania, és egy elhatárolt karakterláncba kell összeállítania.

És egy kicsit töltött adatok:

Mysql implode, felrobban - Vyacheslav Volkov blogja

Most hajtsa végre a következő lekérdezést az adatok egy sztringbe való egyesítéséhez:

Ennek eredményeként a következő adatkészletet kapjuk:

Most illessze az adatokat a "pontosvessző" (";") szimbólumra a SEPARATOR paraméter használatával a következő lekérdezés végrehajtásával.

Ennek eredményeként a minta ezt a jelentést veszi át:

Tehát a GROUP_CONCAT függvénnyel egyesíti az adatokat az adatbázisból egy elválasztó segítségével. Ezenkívül a függvényhez több mező is átvihető egymáshoz (ragasztás). Az ismétlődő adatok elkerülése érdekében használhatja a DISTINCT paramétert.

Ez a funkció korlátozza a kimeneti mennyiséget. Alapértelmezés szerint minden egyes csatlakozáshoz 1024 karakter tartozik minden kimeneti vonalhoz. Ha a ragasztott adatok mérete nagyobb, akkor lesz vágva. A méret bővítéséhez futtatni kell a parancsot (csak akkor, ha rendelkezik a szükséges jogosultságokkal a futtatáshoz)

Az adatok összevonásával mindezen. De ez a határokon átívelő vonal felismerése lenne, ez hosszabb ideig bonyolódik. Nem találtam semmilyen natív támogatást ehhez a MySQL-ben. Az egyetlen megoldás egy tárolt eljárás írása a karakterlánc értelmezéséhez.

A következő egy tárolt eljárás dump.

Az eljárás csak 1 paramétert tartalmaz (például). Ez a vesszővel elválasztott értékek listája. Ezt követően egy ciklust végzünk ezen a paraméteren, és egy határolót keresünk (esetünkben vessző). Minden új érték tárolódik a @sHead változóban, és már használhatók SQL lekérdezésekhez.

Az eljárás hívásához használja a következő kódot.

Ezt követően az új felhasználói azonosítóok a táblázatban jelennek meg. Ez meglehetősen egyszerű példa. Leggyakrabban ilyen műveleteket használok a denormalizált adatok tárolására és azok későbbi normalizálására (triggereken keresztül).

Maga a keresés normál adatok alapján történik, de ha egyszerűen ki kell adni az információt - a kimenetel denormálódik.

Megváltoztathatja ezt az eljárást, és máris használhatja az Ön igényeinek megfelelően.

Ön is érdekelt:

  • Mysql implode, felrobban - Vyacheslav Volkov blogja
    A YAML doktrína létrehozása a MySQL Workbench segítségével
  • Az Apache 2, a PHP 5.3 és a MySQL 5.1 telepítése ...

Kapcsolódó cikkek