Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyszukiwarka, Jak sformulować zapytanie by przeszukac baze
PiotrekSul
post 8.03.2011, 12:29:53
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 22.02.2009

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


Witam,
mam sporą bazę i męczę się z wyszukiwaniem tj. mam np. tabele:
  1. T1
  2. +--------+-------------+-----------+------------+
  3. | T1_ID | T1_NAME | T2_ID | T3_ID |
  4. +--------+-------------+-----------+------------+
  5. | id11 | name11 | id21 | id31 |
  6. | id12 | name12 | id22 | id32 |
  7. | id13 | name13 | id23 | id33 |
  8. +--------+-------------+-----------+------------+
  1. T2
  2. +--------+---------+
  3. | T2_ID | T2_NAME |
  4. +--------+---------+
  5. | id21 | name21 |
  6. | id22 | name22 |
  7. | id23 | name23 |
  8. +--------+---------+
  1. T3
  2. +--------+---------+
  3. | T3_ID | T3_NAME |
  4. +--------+---------+
  5. | id31 | name31 |
  6. | id32 | name32 |
  7. | id33 | name33 |
  8. +--------+---------+
i chce wyszukać we wszystkich kolumnach NAME tekst "name32 name2" tak jak w Googlach czyli łączone ANDem wiec generuje sobie zapytanie:
  1. SELECT * FROM T1
  2. JOIN `T2` ON T1.T2_ID = T2.T2_ID
  3. JOIN `T3` ON T1.T3_ID = T3.T3_ID
  4. WHERE
  5. (
  6. (`T1_NAME` LIKE '%name32%' OR `T1_NAME` LIKE '%name2%' )
  7. AND
  8. (`T2_NAME` LIKE '%name32%' OR `T2_NAME` LIKE '%name2%' )
  9. AND
  10. (`T3_NAME` LIKE '%name32%' OR `T3_NAME` LIKE '%name2%' )
  11. )
niestety to nie spełnia moich oczekiwań bo dla T1_NAME otrzymuje fałsz i zwrócone zostaje mi zero odpowiedzi. Jak dać takie zapytanie zeby otrzymać pozytywny wynik?
Go to the top of the page
+Quote Post
mkozak
post 8.03.2011, 14:40:41
Post #2





Grupa: Zarejestrowani
Postów: 78
Pomógł: 4
Dołączył: 21.03.2005

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


W warunku where dałeś AND pomiędzy nawiasami, więc jeżeli jakikolwiek "nawias" da ci fałsz to and sprawią, że wynik będzie pusty.

Jeżeli to
  1. (`T1_NAME` LIKE '%name32%' OR `T1_NAME` LIKE '%name2%' )

Jest puste to cały warunek nie jest spełniony. Jeżeli szukasz takiego połączenia gdzie w jakiejkolwiek z tabel znajduje się szukany tekst to daj OR pomiędzy nawiasami, a nie AND

Ten post edytował mkozak 8.03.2011, 14:41:01


--------------------
==============================================
Bo ja jestem Wróbelek Htmlek
==============================================
Go to the top of the page
+Quote Post
PiotrekSul
post 8.03.2011, 23:31:25
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 22.02.2009

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


Problem rozwiązany!

rozwiazanie było prostsze niż się spodziewałem :-)
  1. SELECT * FROM T1
  2. JOIN `T2` ON T1.T2_ID = T2.T2_ID
  3. JOIN `T3` ON T1.T3_ID = T3.T3_ID
  4. WHERE
  5. (
  6. (`T1_NAME` LIKE '%name2%' OR `T2_NAME` LIKE '%name2%' OR `T3_NAME` LIKE '%name2%' )
  7. AND
  8. (`T1_NAME` LIKE '%name32%' OR `T2_NAME` LIKE '%name32%' OR `T3_NAME` LIKE '%name32%' )
  9. )
Go to the top of the page
+Quote Post
sn1p3r
post 10.03.2011, 12:16:43
Post #4





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 9.03.2011

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


Cytat(PiotrekSul @ 8.03.2011, 23:31:25 ) *
  1. SELECT * FROM T1
  2. JOIN `T2` ON T1.T2_ID = T2.T2_ID
  3. JOIN `T3` ON T1.T3_ID = T3.T3_ID
  4. WHERE
  5. (
  6. (`T1_NAME` LIKE '%name2%' OR `T2_NAME` LIKE '%name2%' OR `T3_NAME` LIKE '%name2%' )
  7. AND
  8. (`T1_NAME` LIKE '%name32%' OR `T2_NAME` LIKE '%name32%' OR `T3_NAME` LIKE '%name32%' )
  9. )


Niestety takie wyszukiwanie nie używa indeksów (% na początku), więc jak będzie dużo danych, to będzie wolno działac.
Jeśli zależy Ci na wydajności, to proponuje spojrzeć na rozwiązania typu sphinx lub lucene


--------------------
Michał Gruchała
scaleIT.pl
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 Wersja Lo-Fi Aktualny czas: 25.06.2025 - 18:21