Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
X t l a n - 23-10-2005 18:54 like, in, połączenie
Cześć.
Przydałoby mi się coś w MySQL, co działa jak select * form baza where pole1 in ('a','b','cc','dd')
z tą różnicą, że chciałbym aby nie było to dokładne dopasowanie, a dopasowanie jak za pomocą klauzuli like.
Obrazowo mogłoby to wyglądać tak: select * form baza where pole1 in ('a%','b%','cc%','dd%')
ale oczywiście coś takiego nie działa tak, jak chcę, a zapytanie: select * form baza where pole1 like 'a%' or pole1 like 'b%' or pole1 like 'cc%' or pole1 like 'dd%' jest za długie .... (działa, rzecz jasna)
Myślałem o regexp, ale może da się to jakoś prościej jeszcze przygotować.
Dziękujęza rady.
Artur Muszynski - 23-10-2005 18:54
"X t l a n" <x t l a n @ i n t e r i a . p l> wrote in message news:djasna$61r$1@news.onet.pl... > Cześć. > > Przydałoby mi się coś w MySQL, co działa jak > select * form baza where pole1 in ('a','b','cc','dd') > > z tą różnicą, że chciałbym aby nie było to dokładne dopasowanie, a > dopasowanie jak za pomocą klauzuli like. > > Obrazowo mogłoby to wyglądać tak: > select * form baza where pole1 in ('a%','b%','cc%','dd%') > > ale oczywiście coś takiego nie działa tak, jak chcę, a zapytanie: > select * form baza where pole1 like 'a%' or pole1 like 'b%' or pole1 like > 'cc%' or pole1 like 'dd%' jest za długie .... (działa, rzecz jasna)
Czy to jakiś istotny problem, że długie? Można też zastosować union. Dziwny w ogóle wydaje mi się twój problem. Przynajmniej optymalizujesz to zapytanie? Np like 'a%' or like 'ab%' można skrócić do like 'a%'.
> Myślałem o regexp, ale może da się to jakoś prościej jeszcze przygotować.
Regexp będzie chyba dużo wolniejszy w twoim przypadku.
artur
> > > Dziękujęza rady.
X t l a n - 23-10-2005 18:54
> Czy to jakiś istotny problem, że długie?
Wiesz, jak w ten sposób prześlesz z 1000 słów z listy wyboru, to wydaje mi się, że warto baczyć na długość łańcucha z zapytaniem. Co do optymalizacji logicznej nie ma mowy, dane mogą być różne więc trzebeby pisać jakąś funkcję optymalizującą takie zapytanie - szkoda chyba czasu na tą zabawę.
Filip Sielimowicz - 23-10-2005 18:54
Użytkownik "X t l a n" <x t l a n @ i n t e r i a . p l> napisał w wiadomości news:djdbmr$dlk$1@news.onet.pl... >> Czy to jakiś istotny problem, że długie? > > Wiesz, jak w ten sposób prześlesz z 1000 słów z listy wyboru, to wydaje mi > się, że warto baczyć na długość łańcucha z zapytaniem. Co do optymalizacji > logicznej nie ma mowy, dane mogą być różne więc trzebeby pisać jakąś > funkcję optymalizującą takie zapytanie - szkoda chyba czasu na tą zabawę.
Wiesz, funkcja być może nie byłaby taka złożona, za to bazie może to zrobić naprawdę bardzo dużą różnicę (jeśłi będziesz w ten sposób operował na dużych ilościach danych).
X t l a n - 24-10-2005 19:53
> Wiesz, funkcja być może nie byłaby taka złożona, za to bazie może to > zrobić naprawdę bardzo dużą różnicę (jeśłi będziesz w ten sposób > operował na dużych ilościach danych).
Podejmę decyzję w praktyce - jeśli będzie działać wolno, wtedy się doda.
artiun - 24-10-2005 19:53
X t l a n napisał(a): >> Wiesz, funkcja być może nie byłaby taka złożona, za to bazie może to >> zrobić naprawdę bardzo dużą różnicę (jeśłi będziesz w ten sposób >> operował na dużych ilościach danych). > > > Podejmę decyzję w praktyce - jeśli będzie działać wolno, wtedy się doda. Jeśli takie coś Ci jest potrzebne to oznacza jedno. Masz mało danych w bazie (ilość rekordów). I tu nie jest ważne jak długie będzie zapytanie - a ile zwróci wyników. Wtedy regexp - wystarczy. Popatrz na usera - jeśli dla takiej (zaproponowanej w pytaniu konstrukcji) uzyskasz np. (mało) 10000 wyników to co? Zapłacisz mu za dniówkę w przeglądaniu, ok. 500 się pogubi i nie zauważy tego czego szuka. Zapakuj sobie regexp'y nie starcisz za wiele. Moim zdaniem problem wydumany (czasowo nie ma znaczenia dla obsługi).
-- Artur
X t l a n - 24-10-2005 19:53
>> Podejmę decyzję w praktyce - jeśli będzie działać wolno, wtedy się >> doda. > Jeśli takie coś Ci jest potrzebne to oznacza jedno. Masz mało danych w > bazie (ilość rekordów).
Około 1 miliona.
> I tu nie jest ważne jak długie będzie zapytanie > - a ile zwróci wyników.
Do paru tysiecy i trochę nie podoba mi się, że z PHP do MySQL'a będzie sżło takie długie zapytanie. A jeszcze rozważając, że zapytanie będzie pracowało na kilku tableach łączonych JOIN i dla każej z nich będzie ten zestaw OR pole_x like 'wartosc_x_n%' to może łądniej byłoby to: 1) optymalizować względem długości zapytania, 2) likwidować warunki nadmiarowe.
Sądziłem, że punkt 1) można łatwiutko osiągnąć. No a w regexp trzeba jeszcze będzie uważeć na te frazy ze względu na znaki specjalne, w like są tylko dwa % i _
> Wtedy regexp - wystarczy. Popatrz na usera - > jeśli dla takiej (zaproponowanej w pytaniu konstrukcji) uzyskasz np. > (mało) 10000 wyników to co? Zapłacisz mu za dniówkę w przeglądaniu, > ok. > 500 się pogubi i nie zauważy tego czego szuka. Zapakuj sobie regexp'y > nie starcisz za wiele. Moim zdaniem problem wydumany (czasowo nie ma > znaczenia dla obsługi).
Możliwe.
artiun - 24-10-2005 19:53
X t l a n napisał(a): >>> Podejmę decyzję w praktyce - jeśli będzie działać wolno, wtedy się doda. >> >> Jeśli takie coś Ci jest potrzebne to oznacza jedno. Masz mało danych w >> bazie (ilość rekordów). > > > Około 1 miliona. > >> I tu nie jest ważne jak długie będzie zapytanie >> - a ile zwróci wyników. > > > zestaw OR pole_x like 'wartosc_x_n%' to może łądniej byłoby to: 1) > optymalizować względem długości zapytania, 2) likwidować warunki > nadmiarowe. sorry - nie ma znaczenia czy piszesz tabela.pole czy tylko pole (no mniej znaków :-). Uproszczenie konstrukcji (in ( a%.. sprowadza się właśnie do rozpisania tej konstrukcji wg przykładu jaki został podany. Nic to nie zmienia. > > Sądziłem, że punkt 1) można łatwiutko osiągnąć. No a w regexp trzeba > jeszcze będzie uważeć na te frazy ze względu na znaki specjalne, w like > są tylko dwa % i _ > Moim zdaniem to przewidywanie rozbudowy bazy w drażliwych punktach pozwala na określenie gdzie może się znacząco rozrosnąć. I tu trzeba raczej ograniczać ilość danych dla usera końcowego.
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona