Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SQL] Złożone zapytanie

Ostatnio zmodyfikowano 2016-02-21 19:49
Autor Wiadomość
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
 
P-145114
DejaVu
» 2016-02-21 12:59:53
Wklej selecta jakiego masz aktualnie i dopisz jeszcze jakie dane są niepożądane.
P-145115
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.
P-145125
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
P-145128
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

P-145133
« 1 »
  Strona 1 z 1