[MySQL] Sortowanie w grupie

0

Witam,

Borykam się z następującym problemem. Chce wyświetlić listę pracowników danej firmy z jednoczesnym podaniem najwyższego zajmowanego przez nich stanowiska sortując listę w kolejności od najwyższego stanowiska do najniższego. Pracowników mam w jednej tabeli, przyporządkowanie do stanowisk w drugiej. Jeden pracownik może zajmować kilka stanowisk, a każde ze stanowisk ma przypisaną sobie wagę, która ustawia je w hierarchii.

Mam następujący kod:

SELECT e.ID, e.imie, e.nazwisko, e.email, e.nrTel,
		 es.name AS stanowisko
FROM pracownicy AS e
LEFT JOIN przyporzadkowanie AS esl ON esl.empID = e.ID
LEFT JOIN stanowiska AS es ON es.ID = esl.standID
GROUP BY e.ID
ORDER BY es.lvl DESC, nazwisko ASC

Lista wyświetla się prawidłowo, tzn. wybierani są wszyscy pracownicy, którzy wyświetlani są w prawidłowej kolejności. Niestety nie wiem jak ugryźć sprawę wybierania najwyższego stanowiska danego pracownika. Wybierane przez silnik jest jedno, lecz niestety nie zawsze to najwyższe (podejrzewam, że brane jest pierwsze natrafione tzn. to z najniższym ID). Gdzie tu wcisnąć funkcję wybierającą najwyższe z zajmowanym stanowisk?

0

Masz jakąkolwiek strukturę typu id_pracownika, id_przełożonego?

0
kate87 napisał(a):

Masz jakąkolwiek strukturę typu id_pracownika, id_przełożonego?

Jest, ale w tym przypadku nie ma ona tutaj nic do rzeczy.

Okroiłem bazę, usunąłem dane osobowe i wrzuciłem wszystko co niezbędne tu:
https://www.db-fiddle.com/f/u1HMtRFqdwm6cyhkf4L5SQ/0

Wynikiem jest tak jak pisałem lista pracowników z podaniem jednego stanowiska. W przypadku pracowników, którzy mają jedno stanowisko nie ma problemu. W przypadku gdy tych stanowisk jest więcej chciałbym aby podawało to o najwyższej randze (kolumna lvl w employeeStandings). Czyli w podanym przykładzie Karol BBB i Anna EEE powinni mieć wpisane stanowisko Prokurenta, a nie Kierownika Pracowni.

Mam nadzieję, że teraz mamy jasność sytuacji :)

1

Musisz to przefiltrować po liście empid i max(lvl), można tak:

Select
    p.*
FROM (
    SELECT 
        e.ID
        ,e.imie
        ,e.nazwisko
        ,es.name AS stanowisko
        ,es.lvl
    FROM 
        e
        LEFT JOIN esl ON esl.empID = e.ID
        LEFT JOIN es ON es.ID = esl.standID) p
    inner join (select 
                    empID
                    , max(lvl) mlvl 
                from 
                    esl 
                    inner join es on es.ID = esl.standID
                group by empID) ml on p.id=ml.empID and ml.mlvl=p.lvl

http://sqlfiddle.com/#!9/ccd10/11

0
Panczo napisał(a):

Musisz to przefiltrować po liście empid i max(lvl), można tak:

Select
    p.*
FROM (
    SELECT 
        e.ID
        ,e.imie
        ,e.nazwisko
        ,es.name AS stanowisko
        ,es.lvl
    FROM 
        e
        LEFT JOIN esl ON esl.empID = e.ID
        LEFT JOIN es ON es.ID = esl.standID) p
    inner join (select 
                    empID
                    , max(lvl) mlvl 
                from 
                    esl 
                    inner join es on es.ID = esl.standID
                group by empID) ml on p.id=ml.empID and ml.mlvl=p.lvl

http://sqlfiddle.com/#!9/ccd10/11

Dzięki wielkie! O to właśnie chodziło, działa pięknie.
Dodałem jeszcze wiersz sortujący wyniki wg hierarchii stanowisk

SELECT p.* FROM (SELECT e.ID, e.imie, e.nazwisko, es.name AS stanowisko, es.lvl
                 FROM e
                 LEFT JOIN esl ON esl.empID = e.ID
                 LEFT JOIN es ON es.ID = esl.standID) p
INNER JOIN (SELECT empID, max(lvl) AS mlvl 
            FROM esl 
            INNER JOIN es on es.ID = esl.standID
            GROUP BY empID) ml on p.id=ml.empID and ml.mlvl=p.lvl
ORDER BY p.lvl DESC 
0

Jedyny problem możesz mieć z awansem "poziomym" ;)

0
Panczo napisał(a):

Jedyny problem możesz mieć z awansem "poziomym" ;)

Z założenia taka sytuacja w tej firmie nie może mieć miejsca. Ale racja, w innej organizacji mogłoby być to problemem.

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