MySQL Joiny i usunięcie duplikatów

0

Cześć,

Jestem dość nowy w SQL i próbuje utworzyć 1 zapytanie lecz nie do końca mi się to udaje.

Otóż mamy 5 tabel

Pracownik_grupa, Pracownik_lista, Pracownik, Użytkownik Pracownik_ranga.

Teraz próbuje wyświetlić Grupę i ile pracowników ma zakładając pewne kryteria.

Użytkownik może mieć 10 Pracowników
Do zliczeń pracowników wliczamy tylko z danego użytkownika więc jeśli mamy 2 użytkowników którzy mają 10 pracowników to liczba tej grupy to 2.

Pracownik_grupa
ID,Nazwa
1,G1
2,G2
3,G3

Pracownik_Lista
ID,Pracownik_ID,Grupa_ID,Ranga_ID
1,1,1,2
2,2,1,2
3,3,1,2
4,4,1,2
5,5,1,2
6,6,2,2

Pracownik
ID,Nazwa,Uzytkownik_ID
1,AGATA,1
2,JOASIA,1
3,AGA,1
4,JANUSZ,2
5,PAWEŁ,2
6,MATEUSZ,2

Użytkownik
ID,Nazwa,Haslo,stan
1,N1,PASS1,23
2,N2,PASS2,44

Ranga_Grupa
ID,PRACOWNIK_GRUPA_ID,NAZWA,POZIOM
1,1,LIDER,3
2,1,ZCA,2
3,1,PARC,1
4,2,LIDER,3
5,2,ZCA,2
6,2,PARC,1
7,3,LIDER,3
8,3,ZCA,2
9,3,PARC,1

Moje zapytanie, wyświetla ilość ale nie wiem jak usunąć duble z danego użytkownika
select g.id,
g.NAZWA,
(
select count(gms.id) from Pracownik_Lista as gms
LEFT JOIN Pracownik p ON p.id = gms.Pracownik_ID
LEFT JOIN Użytkownik a ON a.id = p.Uzytkownik_ID
LEFT JOIN Ranga_Grupa gr ON (gr.PRACOWNIK_GRUPA_ID = gms.Grupa_ID and gr.id = gms.Ranga_ID)
where gms.guild_id = g.id and a.premdays > 0 and (gr.POZIOM = 3 or gr.POZIOM = 2)
) as member
from Pracownik_grupa as g

0

Aby bardziej było zrozumiale przepisałem do fiddle.
http://sqlfiddle.com/#!9/138843/1

Threrler napisał(a):

Cześć,

Jestem dość nowy w SQL i próbuje utworzyć 1 zapytanie lecz nie do końca mi się to udaje.

Otóż mamy 5 tabel

Pracownik_grupa, Pracownik_lista, Pracownik, Użytkownik Pracownik_ranga.

Teraz próbuje wyświetlić Grupę i ile pracowników ma zakładając pewne kryteria.

Użytkownik może mieć 10 Pracowników
Do zliczeń pracowników wliczamy tylko z danego użytkownika więc jeśli mamy 2 użytkowników którzy mają 10 pracowników to liczba tej grupy to 2.

Pracownik_grupa
ID,Nazwa
1,G1
2,G2
3,G3

Pracownik_Lista
ID,Pracownik_ID,Grupa_ID,Ranga_ID
1,1,1,2
2,2,1,2
3,3,1,2
4,4,1,2
5,5,1,2
6,6,2,2

Pracownik
ID,Nazwa,Uzytkownik_ID
1,AGATA,1
2,JOASIA,1
3,AGA,1
4,JANUSZ,2
5,PAWEŁ,2
6,MATEUSZ,2

Użytkownik
ID,Nazwa,Haslo,stan
1,N1,PASS1,23
2,N2,PASS2,44

Ranga_Grupa
ID,PRACOWNIK_GRUPA_ID,NAZWA,POZIOM
1,1,LIDER,3
2,1,ZCA,2
3,1,PARC,1
4,2,LIDER,3
5,2,ZCA,2
6,2,PARC,1
7,3,LIDER,3
8,3,ZCA,2
9,3,PARC,1

Moje zapytanie, wyświetla ilość ale nie wiem jak usunąć duble z danego użytkownika
select g.id,
g.NAZWA,
(
select count(gms.id) from Pracownik_Lista as gms
LEFT JOIN Pracownik p ON p.id = gms.Pracownik_ID
LEFT JOIN Użytkownik a ON a.id = p.Uzytkownik_ID
LEFT JOIN Ranga_Grupa gr ON (gr.PRACOWNIK_GRUPA_ID = gms.Grupa_ID and gr.id = gms.Ranga_ID)
where gms.guild_id = g.id and a.premdays > 0 and (gr.POZIOM = 3 or gr.POZIOM = 2)
) as member
from Pracownik_grupa as g

0

Takich podstaw nie znasz?
Select distinct ... from ... itd.
https://www.w3schools.com/sql/sql_distinct.asp
http://www.mysqltutorial.org/mysql-distinct.aspx

0

Ale z czym masz prblem? Jakiego wyniku oczekujesz?

0
albundy napisał(a):

Takich podstaw nie znasz?
Select distinct ... from ... itd.
https://www.w3schools.com/sql/sql_distinct.asp
http://www.mysqltutorial.org/mysql-distinct.aspx

Znam, ale albo gdzieś się pogubiłem albo moja wiedza jest źle zinterpretowana. Dodanie DISTINCT niestety ale "nie działa" w takim sensie wynik jest ten sam.
http://sqlfiddle.com/#!9/138843/7

0
Marcin.Miga napisał(a):

Ale z czym masz prblem? Jakiego wyniku oczekujesz?

Po wykonaniu dostaję 3 rekordy gdzie w G1 mam wartość 5, a powinno być 2 bo tylko 2 unikalne konta są przypisane

0
select g.id, g.nazwa, ifnull(q.liczba,0) from WORKER_GROUP G LEFT JOIN
(    select g.id, 
           g.NAZWA,
           count(*) as liczba
    from WORKER_GROUP G
     LEFT JOIN WORKER_LIST WL ON G.ID = WL.Grupa_ID
     LEFT  JOIN USERS U ON U.id = WL.Pracownik_ID
     LEFT  JOIN WORKER_RANK AS WR ON (WR.PRACOWNIK_GRUPA_ID = WL.Grupa_ID and WR.id = WL.Ranga_ID) 
     where WL.Grupa_ID = G.id
     and U.stan > 0 and (WR.LEVEL = 3 or WR.LEVEL = 2)
     group by g.id, g.nazwa) q 
on g.id = q.id

Trochę innym sposobem. Zdaje mi się, że będzie bardziej optymalny

0

@Marcin.Miga , @Mistrzowski Krawiec

Bardzo dziękuje za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1