[SQL] Dwa pytania. Max rekord i niby wyrazenia regularne

0

Witam. Mam strukture tabeli taką

string| Wersja |

trala | 1 |
trala | 2 |
baaa | 1 |
trala | 3 |
trala | 4 |
trala | 5 |
baaa | 2 |
trala | 6 |

Ok. Teraz chce wybrać rekord tam gdzie jest string= "trala" i wersja="3", to daje zapytanie sql

SELECT* FROM rablea WHERE string= "trala" and wersja=3

Jak przekształcic te zapytanie tak, ze jeśli ktoś da zapytanie

SELECT* FROM rablea WHERE string= "trala" and wersja=525

to zostanie wyslany maxymalny rekord werska, gdzie string rowna się "trala", bo nie ma w bazie rekordu 525

2 Pytanie.
Jak to przetlumaczyc na SQL.
Mam tabele


kolumna |

aaa/bbb/ccc |
aaa/nnnnn/ |
aaa/bbb/ddd |
aaa/bbb/ccc/ffff |
aaa/bbb/ccc/jjjj |
aaa/ggg/ddd |
aaa/ppppp/ |

I chciałbym dać zapytanie takie:

SELECT* FROM kolumna WHERE kolumna = "aaa/(.*?)/"

W tym przypadku chciałbym uzyskać w rekordy:
aaa/nnnnn/ |
oraz
aaa/ppppp/ |
Po prostu
aaa/(kazde znaki oprocz slasha)/

Oczywiscie to jest atrapa, bo nie mozna uzywac wyrazen regularnych w SQL

0

Sorry. Zamiast werska to wersja

0

Zalezy o jakim silniku mowimy. W postgresie o ile pamietam sa wyrazenia (choc nie dam sobie reki uciac). Co do pierwszego zapytania to mozesz go rozwiazac poprzez zastosowanie case when.

0

Co do pierwszego pytania, to nasunął mi się taki pomysł (nie sprawdzałem). Jeśli się da to może można zrobić SELECT FIRST 1 z unii, składającej się z w pierwszej kolejności zapytania o konkretny rekord a w drugiej kolejności z zapytania o maksymalny rekord : ) Nie wiem czy to pójdzie, tak tylko głośno myślę :)

Do do drugiego to istotny jest właśnie engine który ma sprostać temu zadaniu (a nie da się tego zrobić li tylko z uzyciem standardowych masek ? czyli _ i %)

0

Oczywiście mowie o zwykłym mysql .

0

Oczywiscie nie jest to takie oczywiste.

  1. Mysql nie obsluguje takiej kombinacji case when z podzapytaniami, wiec pozostaje raczej zadac 2 zapytania a warunek sprawdzac w kodzie
  2. Mysql na pewno nie obsluguje wyrazen regularnych.
0

Ajj to będe musiał to robić programowo.. Dzięki za odpowiedzi.

0

Ymm co do 1 to można tak:

SELECT * FROM tabela WHERE string="trala" AND Wersja  <= (ta twoja wersja) ORDER BY Wersja DESC LIMIT 1

To znaczy: Jeśli wyślesz sobie zapytanie:
SELECT* FROM rablea WHERE string= "trala" and wersja=525

To nic nie otrzymasz bo tak jak mowiles tam nie ma rekordu z wersja = 525

Znow jesli dasz :

SELECT * FROM tabela WHERE string="trala" AND Wersja  <= 525 ORDER BY Wersja DESC LIMIT 1

to zostanie wysłany maksymalnym rekord do liczby 525.
Trzeba uważać aby nie było luk. To znaczy tamte twoje wersje muszą być pożądanie numerowane. To znaczy
1
2
4<-luka bo nie ma 3
5
6
Jeśli tak znów będzie i wyślesz sobie zapytanie

SELECT * FROM tabela WHERE string="trala" AND Wersja  <= 3 ORDER BY Wersja DESC LIMIT 1

to zamiast maxymalnego rekordu wersja otrzymasz rekord o wersja = 2

1 użytkowników online, w tym zalogowanych: 0, gości: 1