tworzę wyszukiwarkę i mam pewien problem.
Mam 6 tabel...
Kod
* articles
article_id //i kilka innych pól, ale wystarczy w tej chwili to jedno
* articles_lang
article_id | title | intro | txt
* news
news_id //jw.
* news_lang
news_id | title | intro | txt
* press_review
review_id //jw.
* press_review_lang
review_id | title | intro | txt
article_id //i kilka innych pól, ale wystarczy w tej chwili to jedno
* articles_lang
article_id | title | intro | txt
* news
news_id //jw.
* news_lang
news_id | title | intro | txt
* press_review
review_id //jw.
* press_review_lang
review_id | title | intro | txt
Daną frazę (w tym wypadku wyszukuję wszystkich wystąpień litery 'a' - %a%) mam znaleźć w 3 tabelach: articles_lang, news_lang, press_review_lang i jednocześnie wyciągnąć z tabel articles, news, press_review dodatkowe informacje (klucz obcy *_id).
Kombinuję z tym wszystkim i nie bardzo mi wychodzi. Doszedłem do wyszukiwania w 2 tabelach:
SELECT a.article_id AS art_id, al.title AS art_title, al.intro AS art_intro, al.txt AS art_txt, NULL, NULL, NULL, NULL FROM articles_lang al INNER JOIN articles a USING (article_id) WHERE LOWER(al.title) LIKE LOWER('%a%') OR LOWER(al.intro) LIKE LOWER('%a%') OR LOWER(al.txt) LIKE LOWER('%a%') UNION ALL SELECT NULL, NULL, NULL, NULL, n.news_id AS news_id, nl.title AS n_title, nl.intro AS n_intro, nl.txt AS n_txt FROM news_lang nl INNER JOIN news n USING (news_id) WHERE LOWER(nl.title) LIKE LOWER('%a%') OR LOWER(nl.intro) LIKE LOWER('%a%') OR LOWER(nl.txt) LIKE LOWER('%a%')
To jest koszmar optymalizacyjny (nieoptymalna konstrukcja LIKE, czas wykonania zapytania: 12s!), dodatkowo nie wiem, jak do tego dołączyć 5 i 6 tabelę (press_review i press_review_lang). Kolejny "UNION" wywala błąd (skrót, nie wszystkie pola):
SELECT a.article_id AS art_id, al.title AS art_t, NULL, NULL, NULL, NULL FROM articles_lang al INNER JOIN articles a USING (article_id) WHERE LOWER(al.title) LIKE LOWER('%a%') OR LOWER(al.intro) LIKE LOWER('%a%') OR LOWER(al.txt) LIKE LOWER('%a%') UNION ALL SELECT NULL, NULL, n.news_id AS news_id, nl.title AS news_title, NULL, NULL FROM news_lang nl INNER JOIN news n USING (news_id) WHERE LOWER(nl.title) LIKE LOWER('%a%') OR LOWER(nl.intro) LIKE LOWER('%a%') OR LOWER(nl.txt) LIKE LOWER('%a%') UNION ALL SELECT NULL, NULL, NULL, NULL, p.review_id, pl.title FROM press_review_lang pl INNER JOIN press_review p USING (review_id) WHERE LOWER(pl.title) LIKE LOWER('%a%') OR LOWER(pl.intro) LIKE LOWER('%a%') OR LOWER(pl.txt) LIKE LOWER('%a%')
Kod
ERROR: UNION types text and integer cannot be matched
Byłbym wdzięczny za sugestie, jak optymalnie przeszukać pola title, intro, txt w każdej z 3 tabel i przy okazji wybrać dane z tabel im odpowiadających. Wydawało mi się to proste, ale albo coś mieszam i niepotrzebnie komplikuję, albo jest to bardziej zamieszane. Nie wiem, rozdrobnić to na więcej zapytań?
Niestety nie mam dostępu do serwera, więc tsearch i podobne rzeczy niestety odpadają

Z góry dzięki za wszelką pomoc!