Hogyan kell helyesen sorba rendezni a karakterláncot a mysql számokkal

  • MySQL

Kedves napszak. Egy áruház fejlesztésében találkoztam azzal a problémával, hogy névtelenül sorolják az árukat, ha van egy számuk a névben.

A rendelkezésre álló adatok: MySQL adatbázis és terméktáblázat névmezővel.

Az áruk nevében több szám is lehet, és mindegyik lehet a vonal különböző pontjain. Íme egy példa:

A normál rendezés (ORDER BY ASC név) alapján a következő listát kapom:

Az árukat az első betűk sorba rendezik, amelyek a számokig terjednek, majd klasszikus sorszámozás történik: 13, 16, 9 és 10, 14, 9. Összehasonlítás csak az első számjegyen történik, így a 9 a 10-es és annál magasabb értékek között van.

Mi a probléma: mivel ezek a számok bárhol megtalálhatók a sorban, félkör alakú zárójelben lehetnek. Mivel a terméknévben található számok bárhol megtalálhatóak, a SUBSTRING_INDEX változatok mindegyike leesik. Még arra sem gondolok, hogy a reguláris kifejezések segíthetnek-e itt. Kiderül, hogy olyan rendezést kell létrehoznod, amely minden szó után a szóközt eltárolja, és egy sztringként vagy számként hasonlítja össze.

Abban a pillanatban úgy döntöttem, hogy ez a kérdés brutális mankó. Amikor kiválasztottam az elemet, levágtam a zárójeleket, és létrehoztam egy másik változót named_order néven, így a jövőben nem kellett megszabadulnom a zárójelektől:

Ezt követően létrehoztam a SPLIT_STR függvényt. amely a változót egy térrel vágja le. Végül a legrosszabb az, hogy a termék nevét külön szavakra és számokra kell vágni, ennek a "tömbnek" minden egyes elemét CAST-on keresztül számba kell hozni, és ennek eredményeképpen nagyszámú változót kell rendezni:

Amint azt a kódból láthatod, a neveket 12 elemre vágtam egy szóközzel, majd váltakozva minden elemet sorszámként és stringként hasonlítottam össze. Ezzel a fajta válogatással minden tökéletesen működik, csak nehéz megnézni ezt a kódot.

A kérdés az, hogy van-e valaki, ha helyesen és megfelelőbb megoldást talál a probléma megoldására? Saját tapasztalat, vagy legalábbis gondoltam, hogyan lehet ugyanazt a funkciót elvégezni, de még tisztább és gyönyörűbb?

Hálás leszek bármilyen gondolatért! És köszönöm előre))