Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyrażenie regularne?
poldo
post
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 24.11.2007

Ostrzeżenie: (0%)
-----


Witam,

Mam pewien nietypowy problem i nie wiem jak go "ugryźć", zaprezentuje na przykładzie o co mi chodzi. Mam a bazie kilka rekordów, zapisanych np. tak:

  1. ID | Numer | ....
  2. 1 | A/1/2012 | ....
  3. 2 | A/5/2012 | ....
  4. 3 | A/21/2012 | ....
  5. 4 | A/101/2012 | ....
  6. 5 | Z/11/2012 | ....


To co muszę wydobyć to maksymalna wartość numeru pomiędzy A/.../2012. Wiem jak wyświetlić (czyli ograniczyć) wyniki do tego czego szukam, ale nie wiem jak zastosować funkcję MAX() w SELECIE by wyświetlał to czego poszukuję. Przykładowo...

  1. SELECT MAX(Numer) FROM `tabela` WHERE Numer REGEXP '(A/)+[0-9]+(/2012)'


...nie zadziała bo zamiast MAX(Numer) musiałbym tutaj zamiast "Numer" wprowadzić jakiś warunek który spowoduje branie pod uwagę tylko tego numeru znajdującego się wewnątrz ciągu, a nie całego ciągu. Dodam że długość ciągu oraz numeru może być różna (dla przykładu jest A/.../2012, ale moż być też np. XYZ/......../2013, itp), dlatego na sztywno nie da się tego określić funkcją SUBSTR(). Ma ktoś pomysł jak mogę wyświetlić maksymalny numer zawierający się w tym przykładzie między A/..../2012 ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
pitu
post
Post #2





Grupa: Zarejestrowani
Postów: 476
Pomógł: 96
Dołączył: 10.04.2008
Skąd: Koszalin

Ostrzeżenie: (0%)
-----


Nie zadziała z substring?
  1. SELECT MAX(SUBSTRING(Numer, 3, 1)) FROM `tabela` WHERE Numer REGEXP '(A/)+[0-9]+(/2012)'


PS. Nie doczytałem o różnej długości...

Ten post edytował pitu 24.11.2012, 22:07:04


--------------------
HTML/CSS/JS: jsfiddle
SQL: sqlfiddle
Go to the top of the page
+Quote Post
poldo
post
Post #3





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 24.11.2007

Ostrzeżenie: (0%)
-----


No właśnie, nie może to być na "sztywno", więc SUBSTRING() odpada ;-(
Go to the top of the page
+Quote Post
Pawel_W
post
Post #4





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

Ostrzeżenie: (0%)
-----


Trochę naokoło ale powinno działać: http://bytes.com/topic/mysql/answers/510254-order-regex
Go to the top of the page
+Quote Post
sazian
post
Post #5





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


a tak
  1. SELECT
  2. MAX(LEFT(sub,locate('/',sub)-1))
  3.  
  4. FROM (
  5. SELECT
  6. substr(numer,locate('/',numer)+1,length(numer)) sub
  7. FROM tabela
  8. ) t
Go to the top of the page
+Quote Post
poldo
post
Post #6





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 24.11.2007

Ostrzeżenie: (0%)
-----


Cytat(sazian @ 25.11.2012, 12:40:17 ) *
a tak
  1. SELECT
  2. MAX(LEFT(sub,locate('/',sub)-1))
  3.  
  4. FROM (
  5. SELECT
  6. substr(numer,locate('/',numer)+1,length(numer)) sub
  7. FROM tabela
  8. ) t


Heja,

Przeanalizowałem Twój kod i jest bardzo zbliżony do tego co chce osiągnąć - ogólnie prawie wszystko jest OK, jest tylko jeden duuuuży problem, nie wiedzieć czemu funkcja MAX() nie działa jak powinna. Zamiast porównywać całe wydobyte liczby to porównuje tylko pierwszy ich znak. Przykładowo mając: A/7/2012, A/33/2012 i A /252/2012 - jako MAX pokaże 7. Gdy zmienię A/7/2012 na np. A/1/2012 to pokazuje jako MAX liczbę 33 - a powinno we wszystkich przypadkach pokazać 252. Może jakoś trzeba by zdeklarować typ danych bo funkcja nie potrafi rozpoznać że to są liczby?

---------------

Zmieniłem trochę kod, by wyrzucił mi posortowane wyniki i uzyskałem niestety ten sam problem co przy użyciu funkcji MAX(), przykład:

  1. SELECT
  2. LEFT(sub,locate('/',sub)-1) AS Wynik
  3. FROM (
  4. SELECT
  5. substr(Numer,locate('/',Numer)+1,length(Numer)) sub
  6. FROM tabela
  7. ) t ORDER BY Wynik DESC


Wynik:
7
33
152
1
03


A powinno przecież być:
152
33
7

1
03

Zgłupiałem już... ;/

Ten post edytował poldo 26.11.2012, 00:59:15
Go to the top of the page
+Quote Post
Sephirus
post
Post #7





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Spróbuj rzucić tą liczbę którą wyciągasz na liczbę - zapoznaj się z CAST

  1. (...) CAST(substr(numer,locate('/',numer)+1,length(numer)) AS UNSIGNED) sub (...)


Może on Ci stringi porównuje po prostu.


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
poldo
post
Post #8





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 24.11.2007

Ostrzeżenie: (0%)
-----


Tak, mam wrażenie że on porównywał stringi - w każdym razie dzięki sazian i Sephirus - udało się w końcu z waszą pomocą ;-)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 00:06