SmthIsNoYes Temat założony przez niniejszego użytkownika |
[SQL] Złożone zapytanie » 2016-02-21 12:53:21 Witam wszystkich, Jestem w trakcie projektowania i testowania pewnej bazy danych i widzę, że moje "rozwiązanie" generuje co najmniej jeden problem. Każde z naszych zleceń realizowane jest przez różnych pracowników na różnych działach postanowiłem więc że najrozsądniej będzie stworzyć tabelę 'zlecenie_info', gdzie każdy z pracowników będzie miał swój własny rekord do danego zlecenia. Ogólnie rzecz biorąc, rozwiązanie działa. Problem pojawia się kiedy w jednym zapytaniu chce odnaleźć zlecenia tylko jednego pracownika i przypisać do wyników pozostałych pracowników w postaci: 1_ZLECENIE_PRACOWNIKA_ID13 | PRACOWNIK_1 | PRACOWNIK_2 | PRACOWNIK_3 | PRACOWNIK_4 | 2_ZLECENIE_PRACOWNIKA_ID13 | PRACOWNIK_1 | PRACOWNIK_2 | PRACOWNIK_3 | PRACOWNIK_4 | 3_ZLECENIE_PRACOWNIKA_ID13 | PRACOWNIK_1 | PRACOWNIK_2 | PRACOWNIK_3 | PRACOWNIK_4 | 4_ZLECENIE_PRACOWNIKA_ID13 | PRACOWNIK_1 | PRACOWNIK_2 | PRACOWNIK_3 | PRACOWNIK_4 | Z góry dziękuję każdą pomoc, pozdrawiam |
|
DejaVu |
» 2016-02-21 12:59:53 Wklej selecta jakiego masz aktualnie i dopisz jeszcze jakie dane są niepożądane. |
|
SmthIsNoYes Temat założony przez niniejszego użytkownika |
» 2016-02-21 17:08:04 SELECT DATE_FORMAT(wysylka, '%m-%d') DATA, CONCAT(firma, ' ', numer, nazwa) ZLECENIE, SUM(szw1 + szw2) PKT, szw1 SZW1, szw2 SZW2, CONCAT(LEFT(imie, 1), '. ', nazwisko) GRAFIK -- tutaj chciałbym pobrać imie, nazwisko grafika (zlecenie.pkid where pracownik.did = 3) FROM zlecenie z LEFT JOIN klient k ON z.kid = k.kid LEFT JOIN zlecenie_pkt pkt ON pkt.zid = z.zid LEFT JOIN zlecenie_status zs ON z.zid = zs.zid LEFT JOIN zlecenie_info zi ON z.zid = zi.zid LEFT JOIN pracownik p ON zi.pkid = p.pkid WHERE wysylka BETWEEN '2016-02-01' AND '2016-02-29' -- btnDataOd, btnDataDo -- AND zi.pkid = 15 -- pkid, id aktualnie zalogowanego uzytkownika AND (CONCAT(wysylka, -- wyszukiwanie firma, numer, nazwa, ' ', szw1, ' ', szw2, ' ', imie, ' ', nazwisko) LIKE '%%') GROUP BY z.zid ORDER BY wysylka , k.firma , PKT DESC; Tak wygląda podstawowe zapytanie, dane pobierane z kontrolek programu zamieniłem na text, wynikiem są wszystkie zlecenia, wszystkich pracowników. A ja chciałbym otrzymać listę zleceń aktualnie zalogowanego użytkownika, i do tej listy pobrać listę pozostałych pracowników zaangażowanych w dane zlecenie. |
|
DejaVu |
» 2016-02-21 18:02:07 SELECT zlecenie.* , GROUP_CONCAT(CONCAT(P2.pkid,'=',P2.imie,' ',P2.nazwisko SEPARATOR ';')) AS PracownicyPowiazani -- wyszukujemy pracownika dla ktorego chcemy zlecenia (patrz: where) FROM pracownik -- chcemy wszystkie zlecenia pracownika (wiec inner join) inner join zlecenie_info on zlecenie_info.pkid = pracownik.pkid -- do zlecenia chcesz dowiazac sobie wszelkie informacje (wiec np. inner join) inner join zlecenie on zlecenie.zid = zlecenie_info.zid -- TU JEST TRICK: dowiazujesz do zlecenia liste pracownikow przypisanych, czyli: left join zlecenie_info as ZI2 ON ZI2.zid=zlecenie.zid and ZI2.pkid<>pracownik.pkid -- TU JEST DRUGI TRICK: dowiazujesz tabele z pracownikami powiazanymi ze zleceniem: left join pracownik AS P2 ON ZI2.pkid=P2.pkid -- tu okreslasz pracownika dla ktorego szukasz zlecen (i ewentualne inne kryteria): WHERE pkid=12345 -- grupujesz dane po to, aby w jednym rekordzie miec n-pracownikow powiazanych ze zgloszeniem group by pracownik.pkid,zlecenie.zid
|
|
SmthIsNoYes Temat założony przez niniejszego użytkownika |
» 2016-02-21 19:49:11 konkretna odpowiedz! Twoje komentarze do kodu są dla mnie bezcenne.
wielkie dzięki
|
|
« 1 » |