Cum să sortați corect șirul cu numere pe mysql

  • MySQL

Orei bune din timpul zilei. În dezvoltarea unui magazin am întâmpinat problema sortimentării incorecte a mărfurilor după nume, dacă au un număr în nume.







Ce este disponibil: baza de date MySQL și tabelul de produse cu câmpul de nume.

În numele mărfurilor pot fi mai multe numere și pot fi toate în diferite locuri ale liniei. Iată un exemplu:

Cu sortarea standard (ORDER BY name ASC), primesc următoarea listă:

Elementele sunt sortate după prima literă, la care numere sunt apoi sortate șir clasic de numere: 13, 16, 9, 10, 14, 9. Comparația apare doar pe prima cifră este de 9, cu toate acestea, după 10 sau mai mare.

Care este problema: prin faptul că aceste numere pot fi găsite oriunde în linie, ele pot fi în paranteze semicirculare sau nu. Din moment ce numerele din numele produsului pot fi găsite oriunde, toate variantele cu SUBSTRING_INDEX scad. De asemenea, nici măcar nu îmi dau seama dacă expresiile regulate pot ajuta aici. Se pare că trebuie să creați un fel care va lua în schimb fiecare cuvânt după un spațiu și îl comparați ca un șir sau ca un număr.







În momentul de față am hotărât, cred, o cârpă brutală. Când am selectat elementul, am tăiat parantezele și am creat o altă variabilă numită name_order, astfel încât în ​​viitor nu mai trebuia să scap de brackets din nou:

Apoi, am creat funcția SPLIT_STR. care va reduce variabila cu un spațiu. În cele din urmă, cel mai rău lucru este să tăiem numele produsului în cuvinte și numere separate, să aducem fiecare element al acestei "matrice" la un număr prin CAST și, ca rezultat, să sortăm printr-un număr imens de variabile:

Așa cum puteți vedea din cod, am tăiat numele în 12 elemente de un spațiu, apoi alternativ comparat fiecare element ca un număr și ca un șir. Cu acest tip de sortare, totul funcționează perfect, este greu să te uiți la acest cod.

Întrebarea este: poate cineva să aibă o soluție mai corectă și mai adecvată la problemă? Experiență proprie, sau cel puțin gândit, cum să facă aceeași funcționalitate, dar mai curat și frumos?

Voi fi recunoscător pentru orice gânduri! Și vă mulțumesc anticipat))







Trimiteți-le prietenilor: