sql - ciekawy przypadek dla joinowcow
bajcik@kolos.math.uni.lodz.pl - 24-12-2006 00:38
sql - ciekawy przypadek dla joinowcow
witam,
Mam taki oto przypadek, 3 tabelki:
1. przedmioty P1 P2 P3 P4
2. przedmioty_w_grupach P1,G1 P1,G2 P2,G1 P3,G2
3. grupy (id, czy wyswietlac) G1,T G2,N
i chodzi mi o zapytanie ktore zwroci
P1,G1 P1,G2 P2,G1 P3,[spoza] P4,[spoza]
czyli: przedmiot,grupa - chyba ze przedmiot nie należy do żadnej grupy wyświetlanej (a może należeć do grup niewyświetlanych), wtedy jeden rekord przedmiot,[spoza]
ma działać pod mysql5(MyIsam), w jednym zapytaniu, bez tworzenia dodatkowego widoku. Z pozoru wydawało się proste ale zaciąłem się na tym.
Jakieś pomysły? Piwo za pierwsze działające rozwiązanie :)
bajcik -- Krzysztof Garus Stronka: http://kolos.math.uni.lodz.pl/~bajcik/ Serwis: http://gielda.linux.pl/ #GG 2065861
Grzegorz Danowski - 24-12-2006 00:38
<bajcik@kolos.math.uni.lodz.pl> wrote in message news:slrneokuu5.tg.bajcik@usosweb.uni.lodz.pl... > witam, > > Mam taki oto przypadek, 3 tabelki: .... > i chodzi mi o zapytanie ktore zwroci > > P1,G1 > P1,G2 > P2,G1 > P3,[spoza] > P4,[spoza] > > czyli: przedmiot,grupa - chyba ze przedmiot nie należy do żadnej grupy > wyświetlanej (a może należeć do grup niewyświetlanych), wtedy jeden rekord > przedmiot,[spoza] >
Zakładając, że rekordu P1.G2 nie powinno być w Twoim przykładzie, bo dla grupy G2 jest N, to wydaje mi się, że zadziała następujący sposób:
Select PG.Przedmiot, Case When G.CzyWyswietlac = 'T' Then PG.Grupa Else '[spoza]' End As GrupaModyfikowana From przedmioty_w_grupach As PG Inner Join grupy As G On PG.GrupaId = G.Id Group By Przedmiot
> Jakieś pomysły? Piwo za pierwsze działające rozwiązanie :)
Skusiłem się :-). Pozdrawiam Grzegorz
Filip Rembiałkowski - 24-12-2006 00:38
bajcik@kolos.math.uni.lodz.pl napisał(a): > witam, > > Mam taki oto przypadek, 3 tabelki: > > 1. przedmioty > P1 > P2 > P3 > P4 > > 2. przedmioty_w_grupach > P1,G1 > P1,G2 > P2,G1 > P3,G2 > > 3. grupy (id, czy wyswietlac) > G1,T > G2,N > > i chodzi mi o zapytanie ktore zwroci > > P1,G1 > P1,G2 > P2,G1 > P3,[spoza] > P4,[spoza] > > czyli: przedmiot,grupa - chyba ze przedmiot nie należy do żadnej grupy > wyświetlanej (a może należeć do grup niewyświetlanych), wtedy jeden rekord > przedmiot,[spoza] > > ma działać pod mysql5(MyIsam), w jednym zapytaniu, bez tworzenia dodatkowego > widoku. Z pozoru wydawało się proste ale zaciąłem się na tym. > > Jakieś pomysły? Piwo za pierwsze działające rozwiązanie :) > > bajcik
create table p ( id varchar(2) primary key ); create table pg ( p varchar(2), g varchar(2), unique pg(p,g) ); create table g ( id varchar(2) primary key, wyswietlac enum('t','n') );
to zwróci przedmioty z grup wyswietlanych select p, g from pg join g on pg.g = g.id where wyswietlac = 't'
a to z niewyswietlanych select id as p, '[spoza]' as g from p where id not in ( select p from pg join g on pg.g = g.id where wyswietlac = 't' )
zatem pozostaje union, i już:
select p, g from pg join g on pg.g = g.id where wyswietlac = 't' UNION ALL select id as p, '[spoza]' as g from p where id not in ( select p from pg join g on pg.g = g.id where wyswietlac = 't' )
hubert depesz lubaczewski - 24-12-2006 00:38
On 2006-12-21, bajcik@kolos.math.uni.lodz.pl <bajcik@kolos.math.uni.lodz.pl> wrote: > Jakieś pomysły? Piwo za pierwsze działające rozwiązanie :)
zwykly left outer join.
depesz
-- rower trekkingowy od złotówki http://www.allegro.pl/item151225399_...ywany_bcm.html
Maciek Dobrzanski - 24-12-2006 00:38
<bajcik@kolos.math.uni.lodz.pl> wrote in message news:slrneokuu5.tg.bajcik@usosweb.uni.lodz.pl... > witam,
> P1,G1 > P1,G2 > P2,G1 > P3,[spoza] > P4,[spoza]
Zakładając, że "czy wyświetlać" (stan) to ENUM(N, T) to:
SELECT p.przedmiot, IF(r.stan & 2, pg.grupa, '[spoza]') AS grupa FROM p LEFT JOIN pg ON pg.przedmiot = p.przedmiot LEFT JOIN (SELECT pg.przedmiot, BIT_OR(CAST(g.stan AS UNSIGNED INT)) AS stan FROM pg LEFT JOIN g ON g.grupa = pg.grupa GROUP BY pg.przedmiot) AS r ON r.przedmiot = pg.przedmiot
Aczkolwiek są wątpliwości w kwestii wydajności powyższego.
Maciek
Filip Rembiałkowski - 24-12-2006 00:38
[OT] Re: sql - ciekawy przypadek dla joinowcow
bajciku to kto zarobił piwo? hę? tylko nie myśl że się wymigasz :)
F.
bajcik@kolos.math.uni.lodz.pl - 27-12-2006 00:11
Świadek Grzegorz Danowski zeznał: > <bajcik@kolos.math.uni.lodz.pl> wrote in message > news:slrneokuu5.tg.bajcik@usosweb.uni.lodz.pl... >> witam, >> >> Mam taki oto przypadek, 3 tabelki: > ... >> i chodzi mi o zapytanie ktore zwroci >> >> P1,G1 >> P1,G2 >> P2,G1 >> P3,[spoza] >> P4,[spoza] >> >> czyli: przedmiot,grupa - chyba ze przedmiot nie należy do żadnej grupy >> wyświetlanej (a może należeć do grup niewyświetlanych), wtedy jeden rekord >> przedmiot,[spoza] >> > > Zakładając, że rekordu P1.G2 nie powinno być w Twoim przykładzie, bo dla > grupy G2 jest N, to wydaje mi się, że zadziała następujący sposób: > > Select > PG.Przedmiot, > Case When G.CzyWyswietlac = 'T' Then PG.Grupa > Else '[spoza]' End As GrupaModyfikowana > From > przedmioty_w_grupach As PG > Inner Join > grupy As G > On > PG.GrupaId = G.Id > Group By > Przedmiot
o inner join musze sobie poczytac. Ale co to za myk z group by po jednej kolumnie?
>> Jakieś pomysły? Piwo za pierwsze działające rozwiązanie :) > Skusiłem się :-).
to rozwiązanie przerobiłem aby pasowało do moich warunków (dodatkowe tabele i warunki) NO I faktycznie działa, i to wydajnie. To rozwiązanie było pierwsze co dodatkowo ułatwia werdykt :) To jak z tym piwkiem zrobimy? W Łodzi (obojętnie kiedy), w Stolicy (przy okazji jak będę) czy przelewem? :>
> Pozdrawiam > Grzegorz
bajcik -- Krzysztof Garus Stronka: http://kolos.math.uni.lodz.pl/~bajcik/ Serwis: http://gielda.linux.pl/ #GG 2065861
Grzegorz Danowski - 27-12-2006 00:11
<bajcik@kolos.math.uni.lodz.pl> wrote in message news:slrnep2ov3.fum.bajcik@usosweb.uni.lodz.pl... >>> i chodzi mi o zapytanie ktore zwroci >>> >>> P1,G1 >>> P1,G2 >>> P2,G1 >>> P3,[spoza] >>> P4,[spoza] >>> >>> czyli: przedmiot,grupa - chyba ze przedmiot nie należy do żadnej grupy .... >> Zakładając, że rekordu P1.G2 nie powinno być w Twoim przykładzie, bo dla >> grupy G2 jest N, to wydaje mi się, że zadziała następujący sposób: >> >> Select >> PG.Przedmiot, >> Case When G.CzyWyswietlac = 'T' Then PG.Grupa >> Else '[spoza]' End As GrupaModyfikowana .... > > to rozwiązanie przerobiłem aby pasowało do moich warunków (dodatkowe > tabele i > warunki) NO I faktycznie działa, i to wydajnie. To rozwiązanie było > pierwsze co > dodatkowo ułatwia werdykt :) To jak z tym piwkiem zrobimy? W Łodzi > (obojętnie > kiedy), w Stolicy (przy okazji jak będę) czy przelewem? :>
Wystarczy wirutalne :-) Pozdrawiam poświątecznie Grzegorz
Paweł Matejski - 27-12-2006 00:11
bajcik@kolos.math.uni.lodz.pl wrote: >> Select >> PG.Przedmiot, >> Case When G.CzyWyswietlac = 'T' Then PG.Grupa >> Else '[spoza]' End As GrupaModyfikowana >> From >> przedmioty_w_grupach As PG >> Inner Join >> grupy As G >> On >> PG.GrupaId = G.Id >> Group By >> Przedmiot > > o inner join musze sobie poczytac.
To jest to samo co ',', czyli zwykły join.
> Ale co to za myk z group by po jednej kolumnie?
Myk działa chyba tylko w MySQL'u.
-- P.M.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
jak to =?ISO-8859-2?Q?zrobi=E6=2E=2E=2E=3F_TSQL_sql_server?==?ISO-8859-2?Q?_?=
Jak =?windows-1250?Q?pobra=E6_szacowan=B9_wielko=9C=E6_zbiory_wy nikowego_w_MS?==?windows-1250?Q?_SQL_2005=3F?=
=?iso-8859-2?Q?=5BMS_SQL=5D_Czy_mo=BFna_wywo=B3a=E6_funkcje_t ylko_raz_dla?==?iso-8859-2?Q?_ca=B3ego_zbioru_=BCr=F3d=B3owego=3F?=
[MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?=
=?ISO-8859-2?Q?k=B3opot_z_uruchomieniem_MY_SQL_dla_C?==?ISO-8859-2?Q?MS_i_CRM_na_Fedora_Core_3?=
Oracle PL/SQL Wstawianie =?ISO-8859-2?Q?wynik=F3w_kolekcji_d?==?ISO-8859-2?Q?o_tabeli?=
[MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?=
=?iso-8859-2?Q?=5Bmssql=5D_Zapytania_rekurencyjne__-_czy_sk=B3adnia_sql?==?iso-8859-2?Q?_co=B6_takiego_przewiduje_=3F?=
[Oracle PL/SQL] Cursor i zapis =?ISO-8859-2?Q?rekord=F3w_do_?==?ISO-8859-2?Q?kolejnych_plik=F3w?=
=?iso-8859-2?Q?=5BMySQL=5D_Co_minimalnie_potrzebne_zeby_mie=E 6_klienta_My?==?iso-8859-2?Q?SQL_na_Linuxie=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plets2.xlx.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 |
|