Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mysql wyrażenia regularne
Forum PHP.pl > Forum > Bazy danych > MySQL
rogeros
Witajcie w jednej kolumnie w bazie danych mam pewną tabelę która jest przez serialize przerobiona na string.
I tak wpadłem na pomysł żeby zrobić selekce danych już z poziomu bazy danych.
Dlatego mam takie pytanie.

czy za pomocą wyrażeń regularnych w mysql określić
  1. <?php
  2. a:5:{s:14:"TES 32 Dreamer";i:3;s:10:"Solina 800";i:8;s:15:"Tango 780 Sport";i:1;s:18:"Tango 780 Family S";i:10;s:12:"Nieokreslony";i:3;}
  3. ?>





ze wartość Solina 800 musi być większa od 0
czyli coś w stylu "Solina 800";i:(.*?);
i zmienna wyciagnieta musi byc wieksza od zera.

w tym przykladzie solina 800 ma wartosc 8




lub może jest funkcja podobna do explode za pomoca ktorej mógłbym sobie wyciąć co jest za 3-cim srednikiem.

W ogole nie mam pomyslu jak to ugryźć. Może ktoś mnie tu naprowadzi na dobrą drogę smile.gif



Witajcie kombinowałem całą noc smile.gif
I udało mi się rozwiązać problem za pomocą takiego zapytania.

Może komuś na przyszłość się przyda.

  1. SELECT jachty, MID( jachty, LOCATE( 'Solina 800', jachty ) + LENGTH( 'Solina 800' ) +4, 1 ) AS wartosc
  2. FROM `jacht_crm` HAVING wartosc >0



A więc. Chcę wyświetlić wartość dla Solina 800 to:
szukam na jakiej pozycji w stringu znajduje się szukane słowo "Solina 800"
w moim przypadku słowo zaczyna się od 38 znaku w stringu.

mnie interesuje to co się znajduje za po tym stringu a dokladnie po "i:"

dlatego jeśli wiem na której pozycji znajduje się słowo Solina 800 (locate)
jesli wiemy jak długi jest string Solina 800 (length)
i dodamy ta STAŁĄ wartość jaka dzieli nas do wyniku czyli 4 znaki

to uzyskamy interesujace nas dane.


Oczywiscie Solina 800 w moim przypadku to marametr ktory w miare potrzeb jest zmieniany.

Pozdrawiam.
Indeo
To takie akrobacje na linie. Baza danych to nie narzędzie do manipulowania danymi na zasadzie "co można wyczarować z danymi z jednego pola" ale potężne narzędzie algebry macierzy pozwalające, strukturyzować, układać, kojarzyć i filtrować dane w oparciu o mechanizmy bazy danych takie jak - pola, tabele, indeksy a nie "wsteczna analiza źle wprowadzonego materiału" smile.gif

Choć przyznam, że istotnie często i z takimi problemami trzeba sobie poradzić. Samo szastanie zapytaniami może być trudne, bo mysql nie oferuje tylu narzędzi (to baza danych nie język programowania) co php. Dlatego ja w takich sytuacjach do tabeli dostawiłbym pole (lub kilka) które zawierałoby odpowiednią informację, którą tak żmudnie próbujesz wydobyć w "locie". Wystarczy że napiszesz sobie skrypcik w php, który kolejno przeanalizuje rekordy - jako wyrażenia regularne lub po prostu jako zdeserializowane dane i wynik analizy zapiszesz sobie w stworzonym polu w tabeli. A na przyszłość warto przewidzieć dodatkowe pole - ile to zaoszczędzi czasu winksmiley.jpg
GrayHat
Trochę odświeżę temat.

Mam pole `data`, o zawartości powiedzmy:

a:3:{i:0;s:15:"blebleblebleble";i:1;s:10:"2008-08-06";i:2;s:10:"2008-08-08";}

I teraz jak wyciągnąć rekordy, w których wartość wyżej pogrubiona (data) jest mniejsza od obecnej daty?
Doszedłem do takiego selecta:

  1. SELECT `data` AS date_from FROM contents WHERE `data` REGEXP 'i:1;s:[:0-9:]+:"(.*)";i:2'


i stoję w miejscu...

Proszę o pomoc.

Pozdrawiam



// edit

OK rozwiązałem problem. Rozwiązanie:

  1. SELECT `data`, UNIX_TIMESTAMP(MID( `data`, LOCATE( 'i:1;s:10:"', `data` ) + 10, 10 )) AS date_from
  2. FROM `contents` WHERE `type` = 'rally' HAVING date_from <span style='color:orange'>< UNIX_TIMESTAMP()
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.