Wyciągnięcie tylko sprecyzowanych rekordów

0

Witam,

Mam taką oto strukturę tabel:
user image

W tabeli STATUSY_PRODUKTOW znajdują się 4 rekordy (Id - Nazwa):
1 - Nierozpoczęty
2 - Rozpoczęty
3 - Nieskończony
4 - Zakończony

Gdy chcę wyciągnąć produkty znajdujące się w zakładce tzw. Do opracowania Produkty Do opracowania to takie, których CHOCIAŻ JEDEN z etapów nie ma statusu 4 (Zakończony) to wyciągam je za pomocą takiego zapytania:

SELECT DISTINCT p.Id_produkty, p.Symbol FROM PRODUKTY as p
LEFT JOIN ETAPY_PRODUKTOW_NADANE as epn ON p.Id_produkty = epn.Id_produkty
LEFT JOIN STATUSY_ETAPOW_NADANE as sen ON epn.Id_etapy_produktow_nadane = sen.Id_etapy_produktow_nadane
WHERE sen.Id_statusy_produktow = 1 OR sen.Id_statusy_produktow = 2 OR sen.Id_statusy_produktow = 3;

A więc rozróżniam to na podstawie statusów z tabeli STATUSY_PRODUKTOW. Dodam, że jest w sumie 6 etapów i każdy ma właśnie swój status.

Problem pojawia się, gdy chcę wyciągnąć produkty tzw. Opracowane. Produkty Opracowane to takie, których WSZYSTKIE etapy mają status 4 (Zakończony). Nie potrafię skonstruować takiego zapytania, chociaż próbowałem coś takiego:

SELECT p.Id_produkty, p.Symbol FROM PRODUKTY as p
LEFT JOIN ETAPY_PRODUKTOW_NADANE as epn ON p.Id_produkty = epn.Id_produkty
LEFT JOIN STATUSY_ETAPOW_NADANE as sen ON epn.Id_etapy_produktow_nadane = sen.Id_etapy_produktow_nadane
HAVING COUNT(sen.Id_statusy_produktow = 4) = 1;

Byłbym bardzo wdzięczny za pomoc :)

0

Pzesyłam poprawiony diagram ERD:
user image

0

Nikt nie jest w stanie mi pomóc z tym ? :(

0

jeżeli zawsze jest 6 etapów to możesz spróbować:

SELECT p.Id_produkty, p.Symbol FROM PRODUKTY AS p 
INNER JOIN (select epn.id_produkty from ETAPY_PRODUKTOW_NADANE AS epn Inner JOIN STATUSY_ETAPOW_NADANE AS sen ON (epn.Id_etapy_produktow_nadane = sen.Id_etapy_produktow_nadane) where sen.Id_statusy_produktow = 4 group by epn.id_produkty having count(epn.id_produkty)=6) sp ON (p.Id_produkty = sp.Id_produkty);
0
Paweł Dmitruk napisał(a):

jeżeli zawsze jest 6 etapów to możesz spróbować:

SELECT p.Id_produkty, p.Symbol FROM PRODUKTY AS p 
INNER JOIN (select epn.id_produkty from ETAPY_PRODUKTOW_NADANE AS epn Inner JOIN STATUSY_ETAPOW_NADANE AS sen ON (epn.Id_etapy_produktow_nadane = sen.Id_etapy_produktow_nadane) where sen.Id_statusy_produktow = 4 group by epn.id_produkty having count(epn.id_produkty)=6) sp ON (p.Id_produkty = sp.Id_produkty);

Wielkie dzięki, działa super :) Raz jeszcze dzięki!

0

Jeszcze potrzebne mi lekkie rozszerzenie tego zapytania. Otóż w tabeli STATUSY_ETAPOW_NADANE ma być przechowywana historia zmian statusów, żeby można było później ładnie wyświetlć historię. W jaki więc sposób zmodyfikować powyższe zapytanie, aby wyciągało tylko rekordy, które mają wszystkie statusy jako 4 (ZREALIZOWANE) oraz żeby były wyciągane tylko te najnowsze rekordy z tabeli STATUSY_ETAPOW_NADANE.

Wystarczy w takim razie lekka modyfikacja tego zapytania, które podał Paweł Dmitruk

SELECT p.Id_produkty, p.Symbol FROM PRODUKTY AS p 
INNER JOIN (SELECT epn.id_produkty FROM ETAPY_PRODUKTOW_NADANE AS epn INNER JOIN STATUSY_ETAPOW_NADANE AS sen ON (epn.Id_etapy_produktow_nadane = sen.Id_etapy_produktow_nadane) WHERE sen.Id_statusy_produktow = 4 GROUP BY epn.id_produkty HAVING COUNT(epn.id_produkty)=6) sp ON (p.Id_produkty = sp.Id_produkty);
0

Mam takie zapytanie:

SELECT p.Id_produkty, p.Symbol, p.Nazwa FROM PRODUKTY as p 
INNER JOIN (SELECT epn.Id_produkty FROM ETAPY_PRODUKTOW_NADANE as epn 
                    INNER JOIN STATUSY_ETAPOW_NADANE as sen ON epn.Id_etapy_produktow_nadane = sen.Id_etapy_produktow_nadane 
                    WHERE sen.Id_statusy_produktow IN (1,2,3)
                    GROUP BY epn.Id_produkty) sp
ON p.Id_produkty = sp.Id_produkty

Wyciąga mi ono wszystkie produkty, których przynajmniej jeden ze statusów jest różny od Zakończony (4)

Dorobiłem filtrację po każdym ze statusów. I chciałbym teraz aby zapytanie rozróżniało i wybierało tylko te rekordy, których np. etap1 = nieskończony. I tak dla wszystkich 6 etapów rozróżnienie. W jaki sposób to zrobić? Nie potrafię tych podzapytań złożyć :/

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