Ez egy Kecs.es blog webfejlesztési ötletek, tanácsok, észrevételek

27aug/090

Keresés egy MySQL-ben tárolt serializált adathalmaz részére

Legelső bejegyzésem arról szól, hogy az adataink serializálva találhatók az adatbázisba, akkor előfordulhat olyan eset, hogy a serializált adat részére vagyunk csak kíváncsiak. Hogy egyszerűbb legyen megérteni mire is gondolok, egy példával szemléltetem az esetet.

Adott egy webshop, ahol a rendelések rögzítésénél tárolni kell számlázási nevet és címet, valamint a szállítási nevet és címet. Hiszen lehet olyan eset, ahol a számlafizető az cégnév teljesen más, mint az a cím ami fel van tüntetve az üzletben, mellyel megtalálják. (pl xyz Bt. de az általa üzemeltetett volt neve a "Legtökéletesebb bolt". Továbbá a bejegyzett székhely lehet egy inkubátorházban, de az üzlethelyiség egy plázában.

Így az adatok logikailag össze függnek, s megérthető hogy valaki serializálta őket. Tehát tárolva van számlanév;számlacím és szállítnév;szállítcím egy-egy mezőben.

Viszont később felmerül egy olyan kérés, hogy visszamenőleg szeretnének rákeresni hogy pl.: lajos névre számláztak-e vagy szállítottak-e. Az egész mezőben így nem lehet keresni, mert akkor eredményként kapnánk Nagy Lajos Király útját is, feltéve ha van ilyen címünk az adatbázisban. Mit lehet ilyenkor tenni?

A probléma megoldásához bújtam a MySQL dokumentációt, amíg rá nem találtam a SUBSTRING_INDEX(mit_bontson_szet, mivel, melyik_kell). Első paramétere, lehet egy string, vagy egy adatbázis mező. Második paraméter a szeparáló karakter, a harmadik paraméter egy index szám, hogy a feldarabolt string hányadik részét kérjük vissza. Viszont arra figyelni kell, hogy 1-től indul az indexelés!

Példa:
Adatbázisunk `orders` táblájának `billing` mezőjének tartalma 'név;cím' akkor ezeket kapjuk:

  SELECT SUBSTRING_INDEX(`billing`, ';', 1) AS billing 
  FROM   `orders` 
  WHERE  1

  SELECT `id` 
  FROM   `orders` 
  WHERE  SUBSTRING_INDEX(`billing`, ';', 1) LIKE '%lajos%'

Az első esetben az eredmény név, a másodikban az azonosító

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

No trackbacks yet.