Wyszukiwanie w wielu tabelach jednoczesnie

0

Witam,
mam sporą bazę i męczę się z wyszukiwaniem tj. mam np. tabele:

T1
+--------+-------------+-----------+------------+
| T1_ID  |   T1_NAME   |   T2_ID   |    T3_ID   |
+--------+-------------+-----------+------------+
| id11   |   name11    |   id21    |    id31    |
| id12   |   name12    |   id22    |    id32    |
| id13   |   name13    |   id23    |    id33    |
+--------+-------------+-----------+------------+
T2
+--------+---------+
| T2_ID  | T2_NAME |
+--------+---------+
| id21   | name21  |
| id22   | name22  |
| id23   | name23  |
+--------+---------+
T3
+--------+---------+
| T3_ID  | T3_NAME |
+--------+---------+
| id31   | name31  |
| id32   | name32  |
| id33   | name33  |
+--------+---------+

i chce wyszukać we wszystkich kolumnach NAME tekst "name32 name2" tak jak w Googlach czyli łączone ANDem wiec generuje sobie zapytanie:

SELECT * FROM T1 
JOIN `T2` ON T1.T2_ID = T2.T2_ID  
JOIN `T3` ON T1.T3_ID = T3.T3_ID 
WHERE 
( 
  (`T1_NAME` LIKE '%name32%' OR  `T1_NAME` LIKE '%name2%' )
  AND 
  (`T2_NAME` LIKE '%name32%' OR  `T2_NAME` LIKE '%name2%' )
  AND 
  (`T3_NAME` LIKE '%name32%' OR  `T3_NAME` LIKE '%name2%' )
)

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?

0

Zamień AND na OR.

0
Marcin.Miga napisał(a)

Zamień AND na OR.

wtedy jako wynik otrzymam wszystkie 3 wiersze a chciał bym otrzymać tylko 2gi (dopisując kolejne słowa do zapytania w wyszukiwarce odpowiedz ma się zawężać a nie rozszerzać)

0
  1. Jaka baza?
  2. Musi być maska, a nie dokładne dopasowanie (LIKE vs =)?
0
piotreksul napisał(a)

wtedy jako wynik otrzymam wszystkie 3 wiersze a chciał bym otrzymać tylko 2gi (dopisując kolejne słowa do zapytania w wyszukiwarce odpowiedz ma się zawężać a nie rozszerzać)

Zwróci Ci wszystkie 3 wiersze ponieważ w drugim warunku masz: "LIKE '%name2%'" - co jest prawdą dla wszystkich 3 wierszy z tabeli T2. Zmień na "LIKE '%name22%'" i dostaniesz tylko 2-gi wiersz.

1

Ja jeszcze dodam, żebyś zainteresował się wyszukiwaniem Full-Text

1
SELECT 
  * 
FROM T1 
JOIN `T2` ON 
  T1.T2_ID = T2.T2_ID  
JOIN `T3` ON 
  T1.T3_ID = T3.T3_ID 
WHERE 
  concat(`T1_NAME`,`T2_NAME`, `T3_NAME`) LIKE '%name32%name2%' 

ale po pierwsze masz strukturę bazy do czegoś takiego do d**y, a po drugie będzie to baarrddzzzooooo wolne - zainteresuj się FTS jak sugeruje sirkruk

0
SELECT * FROM T1 
JOIN `T2` ON T1.T2_ID = T2.T2_ID  
JOIN `T3` ON T1.T3_ID = T3.T3_ID 
WHERE 
`T1_NAME` LIKE '%name32%' OR  `T1_NAME` LIKE '%name2%'  OR `T2_NAME` LIKE '%name32%' OR  `T2_NAME` LIKE '%name2%'OR `T3_NAME` LIKE '%name32%' OR  `T3_NAME` LIKE '%name2%'

pozdrawiam
paweld

0

Może tak:

SELECT * FROM T1 
JOIN `T2` ON T1.T2_ID = T2.T2_ID  AND  (`T1_NAME` LIKE '%name32%' OR  `T1_NAME` LIKE '%name2%' ) AND   (`T2_NAME` LIKE '%name32%' OR  `T2_NAME` LIKE '%name2%' )
JOIN `T3` ON T1.T3_ID = T3.T3_ID  AND  (`T3_NAME` LIKE '%name32%' OR  `T3_NAME` LIKE '%name2%' )
 
0

Problem rozwiązany!

rozwiazanie było prostsze niż się spodziewałem :-) ogólnie przepraszam ze nie uważałem na logice :P

SELECT * FROM T1 
JOIN `T2` ON T1.T2_ID = T2.T2_ID  
JOIN `T3` ON T1.T3_ID = T3.T3_ID 
WHERE 
( 
  (`T1_NAME` LIKE '%name2%' OR  `T2_NAME` LIKE '%name2%' OR `T3_NAME` LIKE '%name2%' )
  AND 
  (`T1_NAME` LIKE '%name32%' OR  `T2_NAME` LIKE '%name32%' OR `T3_NAME` LIKE '%name32%' ) 
)

Dzięki wszystkim za pomoc!

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