[MySQL5] problem z zastosowanie funkcji, procedury w celu unikniecia powtórzeń kodu w zapytaniach
SuperTen - 30-10-2005 10:51
[MySQL5] problem z zastosowanie funkcji, procedury w celu unikniecia powtórzeń kodu w zapytaniach
Witam grupowiczów.
Natknołem się na problem którego nie potrafię przeskoczyć, chodź próbowałem, ale zawsze jest coś nie tak.
Potrzebuję użyć w kliku zapytaniach (w WHERE) wartości zwróconych przez inne zapytanie.
Jako że potrzebuje to zrealizować w kilku zapytaniach to nie chce w każdym z nich powtarzać tego samego kodu.
To powtarzające się zapytanie zwraca identyfikatory (jeden lub kilka) pewnej tabeli
To co ja wymyśliłem do tej pory to zastosowanie Funkcji lub procedur
1. Napisałem sobie funkcje która zwraca mi te ID po przecinku i chciałem to umiescić mniejwięcej tak: SELECT * FROM tabela WHERE a IN(moja_funkcja(12345)), oczywiście to nie zadziała po pod uwagę weżmie tylko pierwszą liczbe (moja_funkcja zwracała np.: "5,67,23")
2. Wyczytałem że IN za parametr moze przyjąć podzapytanie, a więc napisałem procedure która wykonuje zapytanie o te ID które mnie interesują jednak to też nie działa bo nie mozna użyć procedury w SELECT SELECT * FROM tabela WHERE a IN CALL moja_procedura(12345)
Naprawdę wierzę w to że da się to zrobić nie powtarzająć we wszystkich zapytaniach dość skomplowanego kodu zwracającego identyfikatory
Przyszło mi teraz do głowy że można by jeszcze zrobić widok: SELECT * FROM tabela WHERE a IN(SELECT id FROM widok WHERE b=12345)
czy to dobry trop?
-- "Codziennie gdy wstajesz, otrzymujesz szansę aby stać się lepszym" $this->wyslij(); // Linux friendly but win because i must
Krzysztof Wiśniewski - 30-10-2005 10:51
Użytkownik "SuperTen" <SuperTen@Prawie21ProcentPowietrza.pl> napisał w wiadomości news:djsneb$4an$1@tkdami.pl... | Witam grupowiczów. | | Natknołem się na problem którego nie potrafię przeskoczyć, chodź | próbowałem, ale zawsze jest coś nie tak. | | Potrzebuję użyć w kliku zapytaniach (w WHERE) wartości zwróconych przez | inne zapytanie. | | Jako że potrzebuje to zrealizować w kilku zapytaniach to nie chce w | każdym z nich powtarzać tego samego kodu. | | To powtarzające się zapytanie zwraca identyfikatory (jeden lub kilka) | pewnej tabeli | | To co ja wymyśliłem do tej pory to zastosowanie Funkcji lub procedur | | 1. | Napisałem sobie funkcje która zwraca mi te ID po przecinku i chciałem to | umiescić mniejwięcej tak: | SELECT * FROM tabela WHERE a IN(moja_funkcja(12345)), | oczywiście to nie zadziała po pod uwagę weżmie tylko pierwszą liczbe | (moja_funkcja zwracała np.: "5,67,23") | | 2. | Wyczytałem że IN za parametr moze przyjąć podzapytanie, a więc napisałem | procedure która wykonuje zapytanie o te ID które mnie interesują jednak | to też nie działa bo nie mozna użyć procedury w SELECT | SELECT * FROM tabela WHERE a IN CALL moja_procedura(12345) | | Naprawdę wierzę w to że da się to zrobić nie powtarzająć we wszystkich | zapytaniach dość skomplowanego kodu zwracającego identyfikatory | | Przyszło mi teraz do głowy że można by jeszcze zrobić widok: | SELECT * FROM tabela WHERE a IN(SELECT id FROM widok WHERE b=12345) | | czy to dobry trop? |
Bardzo dobry trop. Jedyne ograniczenie dotyczy ilości kolumn zwracanych przez podselekt (ten w nawiasie). Wynosi ono 1. To dolne i górne ograniczenie :)
Pozdrawiam, Krzysiek
=?ISO-8859-2?Q?Rados=B3aw_Witkowicki?= - 04-11-2005 23:16
=?ISO-8859-2?Q?Re=3A_=5BMySQL5=5D_problem_z_zastosowanie?==?I SO-8859-2?Q?_funkcji=2C_procedury_w_celu_unikniecia_powt=F 3?==?ISO-8859-2?Q?rze=F1_kodu_w_zapytaniach?=
SuperTen napisał(a): > Witam grupowiczów. > > Natknołem się na problem którego nie potrafię przeskoczyć, chodź > próbowałem, ale zawsze jest coś nie tak. > > Potrzebuję użyć w kliku zapytaniach (w WHERE) wartości zwróconych przez > inne zapytanie. > > Jako że potrzebuje to zrealizować w kilku zapytaniach to nie chce w > każdym z nich powtarzać tego samego kodu. > > To powtarzające się zapytanie zwraca identyfikatory (jeden lub kilka) > pewnej tabeli > > To co ja wymyśliłem do tej pory to zastosowanie Funkcji lub procedur > > 1. > Napisałem sobie funkcje która zwraca mi te ID po przecinku i chciałem to > umiescić mniejwięcej tak: > SELECT * FROM tabela WHERE a IN(moja_funkcja(12345)), > oczywiście to nie zadziała po pod uwagę weżmie tylko pierwszą liczbe > (moja_funkcja zwracała np.: "5,67,23") > > 2. > Wyczytałem że IN za parametr moze przyjąć podzapytanie, a więc napisałem > procedure która wykonuje zapytanie o te ID które mnie interesują jednak > to też nie działa bo nie mozna użyć procedury w SELECT > SELECT * FROM tabela WHERE a IN CALL moja_procedura(12345) > > Naprawdę wierzę w to że da się to zrobić nie powtarzająć we wszystkich > zapytaniach dość skomplowanego kodu zwracającego identyfikatory > > Przyszło mi teraz do głowy że można by jeszcze zrobić widok: > SELECT * FROM tabela WHERE a IN(SELECT id FROM widok WHERE b=12345) > > czy to dobry trop?
Nie jestem pewnien, ale przeczutaj w dokumentacji do MySQL 5.0 czy zapytania zagniezdzone sa mozliwe. Mi sie wydaje, ze jeszcze nie, ale moge sie mylic.
Pozdro
artiun - 04-11-2005 23:16
=?ISO-8859-2?Q?Re=3A_=5BMySQL5=5D_problem_z_zastosowanie?==?I SO-8859-2?Q?_funkcji=2C_procedury_w_celu_unikniecia_powt=F 3?==?ISO-8859-2?Q?rze=F1_kodu_w_zapytaniach?=
SuperTen napisał(a):
> To co ja wymyśliłem do tej pory to zastosowanie Funkcji lub procedur > > 1. > Napisałem sobie funkcje która zwraca mi te ID po przecinku i chciałem to > umiescić mniejwięcej tak: > SELECT * FROM tabela WHERE a IN(moja_funkcja(12345)), > oczywiście to nie zadziała po pod uwagę weżmie tylko pierwszą liczbe > (moja_funkcja zwracała np.: "5,67,23")
A tak?
mysql> select * from ulog where find_in_set( uid, '000116,000115' ) > 0; +--------+------------+----------+------------+----------+-------------+ | uid | dlast | tlast | dfirst | tfirst | raddr | +--------+------------+----------+------------+----------+-------------+ | 000115 | 2005-08-20 | 02:44:10 | 2005-08-20 | 02:44:10 | 10.17.45.50 | | 000116 | 2005-08-20 | 02:45:10 | 2005-08-20 | 02:45:10 | 10.17.45.50 | +--------+------------+----------+------------+----------+-------------+ 2 rows in set (0.00 sec)
mysql> delimiter // mysql> create function funtest() returns char(32) return '000115,000116'; -> // Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; mysql> select * from ulog where find_in_set( uid, funtest() ) > 0; +--------+------------+----------+------------+----------+-------------+ | uid | dlast | tlast | dfirst | tfirst | raddr | +--------+------------+----------+------------+----------+-------------+ | 000115 | 2005-08-20 | 02:44:10 | 2005-08-20 | 02:44:10 | 10.17.45.50 | | 000116 | 2005-08-20 | 02:45:10 | 2005-08-20 | 02:45:10 | 10.17.45.50 | +--------+------------+----------+------------+----------+-------------+ 2 rows in set (0.00 sec)
Chyba robi co powinno, choć funkcja jest max. uproszczona.
-- Artur
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
mysql i mysql-front, problem
String line; if (line=="cos"){...}....problem
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
[postgres] Problem z =?ISO-8859-2?Q?zmian=B1_struktury_i_z?==?ISO-8859-2?Q?ale=BFno=B6ciami=2E?=
[oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
zanotowane.pldoc.pisz.plpdf.pisz.plkfia-tek.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|