Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Długie zapytanie SQL
Forum PHP.pl > Forum > Bazy danych
ahold
Witam,

Mam pewien problem, potrzebuję wydać do serwera SQL za "jednym zamachem" bardzo długoe zapytanie.

Może mieć od 20 - 50 (!sic) parametrów.

Na szczęscie porównywane dane są w 100 % statyczne.

przykład: wyświetl materiały gdzie tytul jest równy "ala ma kota a kot ma ale" .

ma więc zostać wykonane takie coś:
  1. <?php
  2. SELECT xxx from tabela where tytul='ala' OR tytul='ma' OR tytul='kota' OR tytul='a' OR (....)  i tak do ko&#324;ca.
  3. ?>

Przy 50 "ORach" , serwer sqł się wyłożył i uciął w połowie moje zapytanie.
phpMyAdmin pokazał to samo (...) i zignorował resztę która była mniej więcej od połowy.

Pytanie teraz co zrobić.

Próbowałem użyć komendy

  1. <?php
  2. SELECT *, MATCH(tytul) AGAINST ('ala ma kota a kot ma ale') AS wartosc
  3. ?>

Ale, np tekst w stylu kota, był wykrywany przez np kotsa, ktosa, posia, zosia.
Wiadomo że miał inną "wartość" ale nie było jednoznaczne.

W tym wypadku muszę mieć 100 % pewność że wartość się zgadza.

Mogę zrobić to w pętli PHP, ale wysłanie 50 zapytań do serwera bazodanowego pod rząd z tekstem where xxx='xx' end zapytania, obliczenie rezultatu, kolejne zapytanie (...) - w prostej linii spowoduję utratę pracy.- I cachowanie nie pomoże smile.gif



Ewentualnie może Macie jakąś koncepcję, to podam co chce osiągnąć.

Mamy dwa miasta
"poznań", "wrocław".

(nazwa pola = miasto)
teraz mamy pole tytulu
nazwa pola = tytul

i muszę wydrukować z serwera

powtarzające się rezultaty dla 2 miast.

Moja koncepcja zakładała by pobrać napierw jedno miasto, poznań - zrobić listę TOP 50 nazw tytułów " or tytul1 or tytul 2 "

nastepnie zadać to zapytanie dopisujac WHERE miasto=wroclaw, i dostanę listę ile z tych tytułów powtarza się we wrocławiu.

Może dało by się to zrobić na poziomie jednego zapytania SQL.


dokładnie to chcę osiągnąć:


Muszę wydrukowac listę materiałów które sa z "poznania" i "wroclawia" oraz zawierające taki sam tytuł.
omeck
Sorry, myślenie mi się wyłączyło, więc tylko strzelam - może:
  1. <?php
  2. SELECT xxx FROM tabela WHERE MATCH(tytul) AGAINST ('+ala +ma +kota +a +kot +ma +ale' IN BOOLEAN MODE);
  3. ?>


questionmark.gif

oczywiście musisz mieć nałozony fulltekstowy indeks na fole tytul
ahold
Witaj kolego,
Dobrywieczór,

MATCH AGAINST nawet przy BOOLEAN.

Wyświetla mi brednie "podobne". Jeżeli uzna że coś "troche pasuje" wciska mi taki rekord.

Mam właśnie teraz te opcję, i zobaczyłem, krzycząc "rany boskie co się dzieje".
Wrzuciło mi rekordy których nigdy nie dodawałem. Patrzę, a to wina właśnie match, bo według jego "wagi" jest podobne.
Do wyszukiwania tekstu, to fajna opcja, ale nie do porównywania rekordów.
Mówię nawet + i boolean nie pomogł.
maly_swd
a takie cos?
SELECT xxx from tabela where tytul in ('ala', 'ma', 'kota', 'a', 'kot', 'ma', wpier...')

oczywiscie wczesniej mozesz zoptymalizowac tablice aby nie bylo np 2x 'ma', lub krotkich wyrazow 'a' 'to'...
ahold
Dziękuję maly_swd, po raz kolejny śmiało mogę stwierdzić że powinni Cie zawieźć do głównego urzędu miar i wag, następnie zamknąć do gabloty jako wzorzec forumowicza php który odkrywając proste metody ułatwia pracę i ratuje życie.

Dziękuję Ci.
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.