podzapytania skorelowane

0

Mam zadanie:
Wyświetl nazwiska i pensje trzech najlepiej zarabiających
pracowników.
Rozwiązanie:
SELECT nazwisko, placa_pod FROM pracownicy p
WHERE 3 > (SELECT COUNT(*) FROM pracownicy
WHERE placa_pod > p.placa_pod)
ORDER BY 2 desc;

Czy może mi ktoś wyjaśnić jak to zapytanie działa? tzn.rozumiem działanie podzapytań skorelowanych, ale w tym przypadku warunek where w zapytaniu zewnętrznym jest dla mnie kompletnie nie zrozumiały.

0

Tutaj zapytanie zewnetrzne to jest: sql (SELECT COUNT(*) FROM pracownicy WHERE placa_pod > p.placa_pod)

A zapytanie wewnetrzne jest: sql SELECT nazwisko, placa_pod FROM pracownicy p ORDER BY 2 desc;

0

A konieczne jest tu podzapytanie? LIMIT nie wystarczy?

0

Można ale chodzi o wydajność. Normalnie w niezależnych zapytaniach wykonywałbyś porównanie a potem brał limit 3. W tym zapytaniu skorelowany select wykonuje się tylko raz co jest znacznie szybszy bo dopiero potem jest warunek 3 >

4

Podzapytanie sprawdza, ile jest osób zarabiających więcej niż osoba z bieżącego rekordu. I brana jest do selekcji dopiero wtedy, gdy takich osób jest więcej niż 3. Nie można tego załatwić LIMITem.
EDIT: "gdy takich osób jest MNIEJ niż 3"

0
Marcin.Miga napisał(a):

Podzapytanie sprawdza, ile jest osób zarabiających więcej niż osoba z bieżącego rekordu. I brana jest do selekcji dopiero wtedy, gdy takich osób jest więcej niż 3. Nie można tego załatwić LIMITem.

Głupoty gadasz:

SELECT id, max(amount) 
FROM pracownicy
group by id
limit 3

zaprzecz ze sie nie da :)

0

:) oczywiscie wierze ze u ciebie daje inaczej :)

title

title

0

Widzę, że nie rozumiesz idei tych zapytań. Dokłądnie rozpisałem, o co chodzi w tym zapytaniu. Chodzi o skorelowane zapytanie. To, że wynik wychodzi taki sam, to kwestia znaku. Akurat tu się pomyliłem. gdy go zamienisz, to wtedy będzie lepszy przykład.

0

Wszystko jest fajnie jeżeli wszyscy maja różna wypłatę, bo jak nie to zapytanie nie spełnia oczekiwań: http://sqlfiddle.com/#!9/c75142/1

0
Panczo napisał(a):

Wszystko jest fajnie jeżeli wszyscy maja różna wypłatę, bo jak nie to zapytanie nie spełnia oczekiwań: http://sqlfiddle.com/#!9/c75142/1

No u mnie dziala ok nawet jak maja taka sama wyplate to nadal jest 3 najlepiej zarabaiajcych bo takie jest plecenie: "Wyświetl nazwiska i pensje trzech najlepiej zarabiających". Jesli chodzi ci zeby wybrac 3 najwyzsze zakresy wyplat a nie 3 osoby z najwyzsza wyplata
title

0

Samo zadanie:

Wyświetl nazwiska i pensje trzech najlepiej zarabiających pracowników.

Sugeruje, że mam wybrać 3 najlepiej zarabiających, nic nie wspomina o tym co zrobić jeśli klika osób ma taka samą pensję i na to zwracam uwagę.

Co do Twojego zapytania to nie wiem po co grup by po id, mozna obejść się bez agregacji, dodatkowo nie dając order by nie wiesz jakie wiersze zostana zwrócone

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