ďťż
 
sql - ciekawy przypadek dla joinowcow ďťż
 
sql - ciekawy przypadek dla joinowcow
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • ets2.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com