Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwarka
Forum PHP.pl > Forum > Bazy danych > MySQL
PiotrekSul
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?
mkozak
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
PiotrekSul
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. )
sn1p3r
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
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.