• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mysql - tablica ze struktura zatrudnienia

VPS Starter Arubacloud
0 głosów
568 wizyt
pytanie zadane 11 czerwca 2018 w SQL, bazy danych przez emeryt68 Nowicjusz (130 p.)

Mam prośbę o pomoc w skonstruowaniu zapytania sql do tablicy zawierającej dwa pola.

pracownik i przełożony

W obu polach są przechowywane #id pracownika, poniżej przykład zawartości:

userid przelozonyid  
2 6
6 18
9 2
16 6

Chodzi o zapytanie, które wyświetli informację:

dla przełożonego ID=18

pracownik: 6 - > podwładni pracownika-> 16 i 2 -> podwładni: 9

dla przełożonego ID=6

pracownik: 16 i 2->podwładny ->9

 

Dziękuję za podpowiedź

1 odpowiedź

+1 głos
odpowiedź 12 czerwca 2018 przez Chess Szeryf (76,710 p.)
edycja 28 czerwca 2018 przez Chess
select * from jobers;
+--------+--------+
| userid | overid |
+--------+--------+
|      2 |      6 |
|      6 |     18 |
|      9 |      2 |
|     16 |      6 |
+--------+--------+

#1 Try this:

select x2.userid as j1,x3.userid as j2,x4.userid as j3 from jobers as x2,jobers as x3,jobers as x4 where x2.overid=18 and x3.overid=x2.userid and x4.overid!=x2.overid and x4.overid!=x2.userid;

. Result:

+------+------+------+
| j1   | j2   | j3   |
+------+------+------+
|    6 |    2 |    9 |
|    6 |   16 |    9 |
+------+------+------+

#2:

select x2.userid as j1,x3.userid as j2 from jobers as x2,jobers as x3 where x2.overid=6 and x3.overid!=x2.overid and x3.overid!=(select jobers.overid from jobers where jobers.userid=x2.overid);

. Result:

+------+------+
| j1   | j2   |
+------+------+
|    2 |    9 |
|   16 |    9 |
+------+------+

Nie oto pewnie chodziło, więc podaję inne rozwiązanie:

select * from em;
+--------+--------+
| userid | overid |
+--------+--------+
|      7 |     18 |
|      6 |      7 |
|     14 |      7 |
|      8 |      7 |
|      3 |      6 |
|      2 |      3 |
|     13 |      8 |
|     10 |     13 |
|      1 |      8 |
|     12 |      1 |
|     14 |     12 |
|     15 |     14 |
|     16 |     14 |
|     17 |     14 |
+--------+--------+
set @x = 3;
  
SELECT distinct em1.userid as worker,em2.userid as sub_worker,em4.userid as subordinate from em
left join em as em1 on em1.overid = @x
left join em as em2 on (em2.overid in (em1.userid))
left join em as em4 on em4.overid not in (select userid from em where overid = @x) and em4.userid not in (SELECT userid from em where em.userid in (select userid from em where overid = @x));

. Zmieniając zmienną "x" ujrzysz najprawdopodobniej oczekiwane przez Ciebie rezultaty.

Dla: SET @x = 3;, wynik to:

+--------+------------+-------------+
| worker | sub_worker | subordinate |
+--------+------------+-------------+
|      2 |       NULL |           7 |
|      2 |       NULL |           6 |
|      2 |       NULL |          14 |
|      2 |       NULL |           8 |
|      2 |       NULL |           3 |
|      2 |       NULL |          13 |
|      2 |       NULL |          10 |
|      2 |       NULL |           1 |
|      2 |       NULL |          12 |
|      2 |       NULL |          15 |
|      2 |       NULL |          16 |
|      2 |       NULL |          17 |
+--------+------------+-------------+

, a dla SET @x = 1;, taki:

+--------+------------+-------------+
| worker | sub_worker | subordinate |
+--------+------------+-------------+
|     12 |         14 |           7 |
|     12 |         14 |           6 |
|     12 |         14 |          14 |
|     12 |         14 |           8 |
|     12 |         14 |           3 |
|     12 |         14 |           2 |
|     12 |         14 |          13 |
|     12 |         14 |          10 |
|     12 |         14 |           1 |
|     12 |         14 |          15 |
|     12 |         14 |          16 |
|     12 |         14 |          17 |
+--------+------------+-------------+

. Natomiast dla SET @x = 44;:

+--------+------------+-------------+
| worker | sub_worker | subordinate |
+--------+------------+-------------+
|   NULL |       NULL |           7 |
|   NULL |       NULL |           6 |
|   NULL |       NULL |          14 |
|   NULL |       NULL |           8 |
|   NULL |       NULL |           3 |
|   NULL |       NULL |           2 |
|   NULL |       NULL |          13 |
|   NULL |       NULL |          10 |
|   NULL |       NULL |           1 |
|   NULL |       NULL |          12 |
|   NULL |       NULL |          15 |
|   NULL |       NULL |          16 |
|   NULL |       NULL |          17 |
+--------+------------+-------------+

. Powyższe dwa rozwiązania są błędne z założeń Twojego zadania o ile dobrze zrozumiałem, ostatecznym rozwiązaniem tego problemu jest ten kod:

SELECT distinct em1.userid as worker,em2.userid as sub_worker,em4.userid as subordinate from em
left join em as em1 on em1.overid = 1
left join em as em2 on em2.overid in (em1.userid)
left join em as em4 on em4.overid = (em2.userid);

.

1
komentarz 21 czerwca 2018 przez emeryt68 Nowicjusz (130 p.)

Dziękuję bardzo, jednak dalej nie mogę sobie poradzić z tą tablicą i zapytaniem.

Testowałem to na tablicy:

userid overid  
7 18
6 7
14 7
8 7
3 6
2 3
13 8
10 13
1 8
12 1
14 12
15 14
16 14
17 14

 

I otrzymuję dziwne dane.

Będę bardzo zobowiązany za podpowiedź i pomoc. Dziękuję

Podobne pytania

0 głosów
2 odpowiedzi 654 wizyt
pytanie zadane 10 sierpnia 2018 w SQL, bazy danych przez mi-20 Stary wyjadacz (13,190 p.)
0 głosów
1 odpowiedź 161 wizyt
0 głosów
2 odpowiedzi 257 wizyt
pytanie zadane 9 kwietnia 2018 w C i C++ przez lambdag Obywatel (1,310 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...