MySQL Wybrać rekordy z tabeli znajdujące się w innych tabela

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Awatar użytkownika
Sektor
Użytkownik
Posty: 271
Rejestracja: 2004-08-28, 12:21
Lokalizacja: Kraków
Kontakt:

MySQL Wybrać rekordy z tabeli znajdujące się w innych tabela

Post autor: Sektor »

Witam, przyznaje się że studiowałem już książki o MySQL, ale nadal mam kłopot z pewnymi zapytaniami :)

Mam tabelę z nazwami warzyw (dla przykładu) "warzywa"
pola 'id' typu int oraz 'name' typu varchar

Mam jeszcze dwie tabele z opisami tych warzyw. (np. "zielone" oraz "czerwone")

pola 'id' 'name' oraz 'description'

Jak wykonać zapytanie znajdujące wszystkie rekordy z pierwszej tabeli występujące w polu 'description' pozostałych dwóch tabel ?

Jak ma brzmieć to zapytanie ? "select warzywa.name where co dalej ? :)"

PRZEPRASZAM, zapomniałem nadmienić że ma znajdować rekordy znajdujące się w jednej LUB w drugiej bazie (lub w obydwóch) NIEKONIECZNIE W OBYDWÓCH NARAZ
Ostatnio zmieniony 2006-05-05, 13:45 przez Sektor, łącznie zmieniany 1 raz.

Mariusz
Użytkownik
Posty: 58
Rejestracja: 2005-06-13, 08:40
Lokalizacja: NY

Re: MySQL Wybrać rekordy z tabeli znajdujące się w innych tabela

Post autor: Mariusz »

Jeśli dobrze rozumiem problem to ja bym to zrobił tak:

Kod: Zaznacz cały

select w.name from warzywa w
where exists (select 1 from zielone z
                    where z.name = w.name)
or exists (select 1 from czerwone c
              where c.name = w.name)
A na polu name we wszystkich tych tabelach dobrze by było założyć indeksy, zapytania się bedą szybciej wykonywały.

Mariusz

Awatar użytkownika
Hannibal
Moderator w st. spocz.
Posty: 1644
Rejestracja: 2004-06-08, 16:03
Lokalizacja: Łódź
Kontakt:

Re: MySQL Wybrać rekordy z tabeli znajdujące się w innych tabela

Post autor: Hannibal »

Zagnieżdżone selecty działają dopiero od MySQL 5.0. Lepszy chyba byłby jakiś JOIN.

Kod: Zaznacz cały

SELECT warzywa.name FROM warzywa, zielone, czerwone WHERE warzywa.name=zielone.name OR warzywa.name=czerwone.name
Nie jestem na 100% przekonany że to zadziała bo takich połączeń (albo tu albo tu) nie widziałem jeszcze.
[size=75]Hannibal@current@2.6.X[/size]

Mariusz
Użytkownik
Posty: 58
Rejestracja: 2005-06-13, 08:40
Lokalizacja: NY

Re: MySQL Wybrać rekordy z tabeli znajdujące się w innych tabela

Post autor: Mariusz »

Więc w currencie jest już odpowiednia wersja MySQL-a ;)
Jak dla mnie, czyli na oko, bo nie mam tutaj zainstalowanego MySQL-a, to Twoje zadziała.
Jedynie co jeszcze, to się rekordy mogą rozmnożyć w niektórych przypadkach, więc dorzuciłbym group by warzywa.name na końcu.
Ostatnio zmieniony 2006-05-06, 23:00 przez Mariusz, łącznie zmieniany 1 raz.

Awatar użytkownika
Hannibal
Moderator w st. spocz.
Posty: 1644
Rejestracja: 2004-06-08, 16:03
Lokalizacja: Łódź
Kontakt:

Re: MySQL Wybrać rekordy z tabeli znajdujące się w innych tabela

Post autor: Hannibal »

Co do rozmnożenia nie jestem przekonany, ale lepszym wyjściem w tym wypadku było by DISTINCT na początku.
[size=75]Hannibal@current@2.6.X[/size]

Mariusz
Użytkownik
Posty: 58
Rejestracja: 2005-06-13, 08:40
Lokalizacja: NY

Re: MySQL Wybrać rekordy z tabeli znajdujące się w innych tabela

Post autor: Mariusz »

Dlaczego lepszym? Oba zapytania dadzą taki sam wynik i wydajnościowo też powinny być identyczne w tym przypadku.

Awatar użytkownika
Hannibal
Moderator w st. spocz.
Posty: 1644
Rejestracja: 2004-06-08, 16:03
Lokalizacja: Łódź
Kontakt:

Re: MySQL Wybrać rekordy z tabeli znajdujące się w innych tabela

Post autor: Hannibal »

Co do wydajności mam wątpliwości. IMHO DISTINCT odrzuca zduplikowane rekordy na początku, a GROUP BY najpierw wybiera wszystkie i dopiero grupuje. Ale to chyba kwestia doczytania dokumentacji jak działa optymalizacja w tych wypadkach (ewentualnie można przeprowadzić test na jakiejś duuuużej bazie).
[size=75]Hannibal@current@2.6.X[/size]

israel
Użytkownik
Posty: 471
Rejestracja: 2005-03-11, 19:34

Re: MySQL Wybrać rekordy z tabeli znajdujące się w innych tabela

Post autor: israel »

Witam,
Nie wiem czy dobrze zrozumialem ale ja bym te tabele polaczyl kluczem obcym i wtedy dajesz

Kod: Zaznacz cały

select * from warzywa,opisy where warzywa.id_w=opsiy.id_o
Co do konkretnych kolumn w tabelach to zgaduje bo nie wiem dokladnie jak to wyglada u Ciebie
pozdrawiam
[url=http://userbars.org][img]http://img131.imageshack.us/img131/1820/jewishcopymb1.gif[/img][/url]
[url=http://userbars.org][img]http://img239.imageshack.us/img239/9184/polandbar2bj9.gif[/img][/url]

ODPOWIEDZ