Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie ciągu znaków na wielu tabelach
Forum PHP.pl > Forum > Bazy danych > MySQL
Sokrates
Witam, mam takie pytane, czy jest możliwe w jednym zapytaniu
wyciągnąć szukane słowo ale z wielu tabel?

tzn. mam tabele odpowiadającą za newsy, inną odpowiadającą za blog, i jeszcze inne tabele które należą do różnych
działów.
Bardzo popularne jest w opcjach wyszukiwania na serwisach 'szukaj wszędzie'.
Te tabele mają generalnie podobne pola ale różnią się nazwami pól i tabel.

Czy jest możliwe w jednym zapytaniu przeszukać dokładnie 5 tabel odpowiadających za kolejne działy w serwisie?
I pogrupować te dane wynikowe jakoś (np na działy).
dokładnie chcę uzyskać id wpisu, nazwę wpisu , datę i krótki opis, a szukam po specjalnej komórce 'sarche' która jest typu text
i ma ustawiony na komórce fulltext. Szukam oczywiście jakiegoś słowa , wyrażenia wpisanego przez kogoś.

Ma ktoś jakiś pomysł jak to zrobić?

I kolejne pytanie , czy takie rozwiązanie z jednym zapytaniem, do wielu tabel jest optymalne?
Czy lepiej każdą tabele odpytywać z osobna potem te dane jakoś połączyć i wyświetlić wynik?

Które rozwiązanie jest według was leprze?

Dzięki i pozdrawiam....
nevt
np tak
  1. SELECT 'nazwa działu 1' AS `dzial`, `pole1` FROM `tabela1` WHERE `pole1` LIKE '%szukana fraza%'
  2. UNION ALL SELECT 'nazwa działu 2', `pole2` FROM `tabela2` WHERE `pole2` LIKE '%szukana fraza%'
  3. UNION ALL SELECT 'nazwa działu 3', `pole3` FROM `tabela3` WHERE `pole3` LIKE '%szukana fraza%';
Sokrates
Ale czy to jest bezpieczne zapytanie?
No i czy lepiej zapytać bazę tak (w jednym zapytaniu), czy w paru zapytaniach z osobna?

Cytat(nevt @ 18.11.2008, 21:34:31 ) *
np tak
  1. SELECT 'nazwa działu 1' AS `dzial`, `pole1` FROM `tabela1` WHERE `pole1` LIKE '%szukana fraza%'
  2. UNION ALL SELECT 'nazwa działu 2', `pole2` FROM `tabela2` WHERE `pole2` LIKE '%szukana fraza%'
  3. UNION ALL SELECT 'nazwa działu 3', `pole3` FROM `tabela3` WHERE `pole3` LIKE '%szukana fraza%';


Coś to zapytanie z UNION nie za dobrze działa , najpierw wołał coś o GROUP BY bo zapytania sobie grupowałem , potem woła cały czas
te działy , możesz pokazać takie zapytanie na żywym przykładzie....
nevt
no trzeba uważać - jak przeciążysz serwer to wybuchnie smile.gif to zresztą cecha większości zapytań...

spotkałeś się może kiedyś z pozycją "manual MySQL"? jak nie - polecam google...

no i niby jak mam ci pokazać, że przykład działa? wysłać testowa bazę?
to ty pokaż co namieszałeś z tym pytaniem (mój przykład działa na 100%...)
i pokaż jakie błędy ci wyskakują...

a skoro nie rozumiesz nazw działów, to sobie zrób:
  1. SELECT 'jakiś tekst' AS 'nazwa_pola';

i obejrzyj wyniki...
Sokrates
hmm,
rozumie nazwy działów i właśnie dlatego uważam że się trochę zapędziłeś.
Napisałeś je nie w tej kolejności....

Co do problemu, u mnie każdy dział to osobna tabela,
idąc tym tropem chyba nie potrzebuje zapisu ''nazwa działu 1' AS `dzial`,
wiec go usunąłem , wtedy MySQL krzyczał że nie poprawna składnia z GROUP BY i ORDER BY,
więc usunąłem to, i zadziałało, ale dane są nie poprawne i przekłamane, pokazuje mi w komórkach
takie rzeczy które wiem że są w zupełnie innych komórkach.
Czy można za pomocą UNION jakoś te dane pogrupować i odpowiednio po sortować?
I jak mogę rozróżnić że dane pochodzą z tabeli newsów a nie innej ?
Z tego co widzę wyniki są nie rozróżnialne.

Oto moje zapytanie na 3 tabelach:
  1. SELECT R.reviews_id AS sarche_id, R.reviews_dataadd AS sarche_dataadd, R.reviews_name AS sarche_name, R.reviews_truncate AS sarche_truncate, R.reviews_estimate_vt AS sarche_estimate, count(C.comment_id) AS sarche_comment FROM videotesty_reviews R LEFT JOIN videotesty_comments C ON (C.comment_reviews_id = R.reviews_id) WHERE R.reviews_active = '1' AND ( R.reviews_name LIKE '%test%' OR R.reviews_search LIKE '%test%' OR R.reviews_spec_search LIKE '%test%') GROUP BY R.reviews_id ORDER BY R.reviews_id DESC UNION ALL SELECT A.advices_id AS sarche_id, A.advices_name AS sarche_name, A.advices_image AS sarche_image, A.advices_truncate AS sarche_truncate, A.advices_estimate_vt AS sarche_estimate, count(C.comment_id) AS sarche_comment FROM videotesty_advices A LEFT JOIN videotesty_comments C ON (C.comment_advices_id = A.advices_id) WHERE A.advices_active = '1' AND ( A.advices_name LIKE '%test%' OR A.advices_search LIKE '%test%') GROUP BY A.advices_id ORDER BY A.advices_id DESC UNION ALL SELECT N.news_id AS sarche_id, N.news_dataadd AS sarche_dataadd, N.news_name AS sarche_name, N.news_image AS sarche_image, N.news_truncate AS sarche_truncate, count(C.comment_id) AS sarche_comment FROM videotesty_newsy N LEFT JOIN videotesty_comments C ON (C.comment_news_id = N.news_id) WHERE N.news_active = '1' AND ( N.news_name LIKE '%test%' OR N.news_search LIKE '%test%') GROUP BY N.news_id ORDER BY N.news_id DESC

Jak usuniesz łączenie do tabeli comments i ostatni wpis count() oraz ORDER BY i GROUP BY to to zapytanie z UNION zadziała.
Z kolei jak usuniesz UNION ALL to uzyskasz 3 zapytania SELECT zgrupowane i posortowane, (grupuje) bo do każdego rekordu muszę jeszcze zaczytać ilość komentarzy.
nevt
wybacz, ale pytanie twoje brzmiało:
Cytat
Witam, mam takie pytane, czy jest możliwe w jednym zapytaniu
wyciągnąć szukane słowo ale z wielu tabel?

na co dostałeś prostą i jasną odpowiedź - (pomijając fakt, że nadal kompletnie nie rozumiesz o co chodzi z nazwami działów...)

ani słówka nie wspomniałeś, że potrzebujesz oprócz tego te dane pogrupować, policzyć i posortować i połączyć z komentarzami...

ale niech będzie, mam dobry dzień, to ci wyjaśnię skąd się wziął twój kłopot. z niepotrzebnego rozbicia tych takich samych danych do różnych tabel (twoje działy). wszystkie wspólne dane powinieneś trzymać w jednej tabeli z dodaną kolumną `dzial_id` powiązaną z tabelą `dzialy` gdzie przechowywałbyś ich nazwy. wtedy twoje zapytanie byłoby prostym selektem z jednym joinem do komentarzy, z jedną klauzulą where, z pojedynczym grupowaniem i sortowaniem. i byłoby niezależne od aktualnej ilości działów w serwisie...
Sokrates
Może i masz racje....
ale...
w tym przykładzie widzisz tylko wspólne komórki,
oprócz tego każden dział (tabela) posiada unikatowe komórki dla każdego z działów
(Newsów, Pliki, Bloga,itd...).
Nie trzymam nigdzie w komórkach informacji o dziale bo w zależności od działu sięgam do
odpowiedniej tabeli.
Więc z mojego punktu widzenia tworzenie tabeli z 50 komórek z czego wykorzystywanych jest tylko
10 jest nie optymalnym podejściem.

No i wracając do sensu pytania z pierwszego postu, to muszę powiedzieć że twoja ostatnia
odpowiedz nic nie wnosi do tego tematu.
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.