🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych
Article #195118

Re: [mysql] Łączenie danych z wielu tabel

#195118
From: kamil.sobczyk
Date: Tue, 18 Oct 2016 08:50
75 lines
4646 bytes
W dniu poniedziałek, 17 października 2016 22:38:41 UTC+2 użytkownik geos napisał:
> On 17.10.2016 20:02, kamil.sobczyk@gmail.com wrote:
> 
> > Szukam pomocy w stworzeniu zapytania SQL (mysql) zwracającego dla grupy wiekowej 11 lat (pole w tabeli **Klub**) w roku 2012 i kwartale 3 coś na podobieństwo:
> >
> > ||=id_zawodnik||id_szkolka||grupa_wiekowa||rok||kwartal||punkty_b5||punty_b10||punkty_30||SUMA
> > ||1||2||11||2012||3||null||20||5||25
> > ||2||2||11||2012||3||null||null||5||5
> > ||3||2||11||2012||3||15||20||5||40
> > ||4||2||11||2012||3||null||null||null||0
> >
> > oraz zapytania zwracającego wszelkie dostępne daty (rok, kwartal) jakie występują w tabelach **BIEG5**, **BIEG10**, **BIEG30** ?
> >
> > Będę wdzięczny za wszelką pomoc.
> 
> tak na pierwszy rzut oka to trochę nieintuicyjnie sobie zaprojektowałeś 
> te biegi. czemu trzy osobne tabele a nie jedna z kolumną np. dystans o 
> wartościach 5, 10, 30 (czy jakie tam kiedyś w przyszłości dodatkowe 
> będą)? albo jedna partycjonowana po tej kolumnie jeśli zależy Ci na 
> osobnych segmentach danych.
> 
> wracając do pytania - spróbuj napisać sobie taki widok w mysql:
> 
> select
>    b.dst, b.idz, b.idsz, k.gw, b.rok, b.kw
> , max(case when dystans = 5 then punkty end) p5
> , max(case when dystans = 10 then punkty end) p10
> , max(case when dystans = 30 then punkty end) p30
> from
> ( select idz, idsz, rok, kw, punkty_5 pkt, 5 dst from bieg5 union all
>    select idz, idsz, rok, kw, punkty_10 pkt, 10 dst from bieg10 union all
>    select idz, idsz, rok, kw, punkty_30 pkt, 30 dst from bieg30 ) b
> left join klub k on b.idk = k.idk
> left join zawodnik z on b.idz = z.idz
> group by b.dst, b.idz, b.idsz, k.gw, b.rok, b.kw
> ;
> 
> i dalej z tego widoku odpytuj o rok, kwartał czy co tam chcesz. a jak 
> nie chcesz widoku to dodaj pożądane warunki do tego zapytania powyżej. 
> sumę też możesz obliczać albo w zapytaniu do widoku albo w definicji widoku.
> 
> wygląda na to, że start zawodnika ze szkółki w biegu X jest raz na 
> kwartał. nie wnikam dalej w to, ale jeśli jest inaczej to ten max 
> oczywiście nie zadziała, potrzebna byłaby dodatkowa kolumna np. 
> numer_startu.
> 
> ewentualnie jeśli mysql obsługuje pivot to możesz skorzystać z pivota.
> 
> jeśli chodzi o dostępne kombinacje rok/kwartał to wykorzystaj fragment 
> "b" powyżej, zamień union all na union i usuń kolumny poza rok i kw.
> 
> łubu dubu, łubu dubu, niech nam żyje prezes klubu!
> 
> pozdrawiam
> geos

Ogólnie problem jest taki, że tych "konkurencji" jest wiele. Dzieciaki oprócz biegów rywalizują też w rzucie piłką lekarską, skoku w dal itp. A liczba tych konkurencji może się zmieniać (pól/kategorii oceniania w danej konkurencji może być wiele, choć w każdej jest pole SUMA/PUNKTY). I pomiary są robione raz na kwartał.

Zastanawiam się czy nie będzie lepiej jak stworzę sobie dodatkową tabelę, powiedzmy:

Wyniki
id_zawodnik (pk)
id_szkolka (pk)
rok (pk)
kwartal (pk)
punkty_b10 {default 0}
punkty_b20 {default 0}
punkty_b30 {default 0}
...
punkty_skok {default 0}

i w niej będę sobie na bieżąco aktualizował dane.

Pewnie dla bazodanowych wyjadaczy ;) jest to podejście mało profesjonalne, ale... ;)
Dziękuję za pomoc!
Technical Details
Message-ID: <f54591f8-2697-4abb-ae25-3575f5645bd6@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!news.glorb.com!g45no2045109qte.1!news-out.google.com!203ni1638itk.0!nntp.google.com!e187no1736813itc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <f97272db-262f-4f16-912e-f32dacc7518b@googlegroups.com> <580536ce$0$5152$65785112@news.neostrada.pl>

Show Full Headers
Complete Article Headers
X-Received: by 10.237.57.99 with SMTP id l90mr518120qte.22.1476780637243;        Tue, 18 Oct 2016 01:50:37 -0700 (PDT)
X-Received: by 10.157.10.132 with SMTP id 4mr83234otq.7.1476780637194; Tue, 18 Oct 2016 01:50:37 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!news.glorb.com!g45no2045109qte.1!news-out.google.com!203ni1638itk.0!nntp.google.com!e187no1736813itc.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.bazy-danych
Date: Tue, 18 Oct 2016 01:50:36 -0700 (PDT)
In-Reply-To: <580536ce$0$5152$65785112@news.neostrada.pl>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=83.238.28.151; posting-account=MZqKhQoAAAD5JCk5fBCRURrOJPrkLjus
NNTP-Posting-Host: 83.238.28.151
References: <f97272db-262f-4f16-912e-f32dacc7518b@googlegroups.com> <580536ce$0$5152$65785112@news.neostrada.pl>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <f54591f8-2697-4abb-ae25-3575f5645bd6@googlegroups.com>
Subject: Re: [mysql] Łączenie danych z wielu tabel
From: kamil.sobczyk@gmail.com
Injection-Date: Tue, 18 Oct 2016 08:50:37 +0000
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit