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