mysql problem ze zrozumieniem

0

Zaczalem sie uczyc mysql ze strony oficjalnej i mam problem ze zrozumieniem :
Task: Find the number, dealer, and price of the most expensive article.
czyli ogranicza sie do znalezienai najwyzszej kwoty.

SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.price < s2.price
WHERE s2.article IS NULL;
+---------+--------+-------+
| article    | dealer  |   price   |
+---------+--------+-------+
|    0004    | D       | 19.95    |
+--------- +--------+-------+

W moim mniemaniu:
Zalozmy, ze kwoty to 1 ,2 ,3 , czyli
s1.price (operator) s2.price

1<1 falsz - > s2.article = null - czyli wypisujemy s1.article, s1.dealer, s1.price
1<2 falsz - > s2.article = "wartosc" zostawiamy
1<3 falsz - > s2.article = "wartosc" zostawiamy
2<1 falsz - > s2.article = "null" wypisujemy
Czyli juz blad, bo miala byc tylko jeden wiersz wypisany.

Moglby mi ktos wytlaczyc co zle interpretuje, a moze kdo niepoprawny"

http://dev.mysql.com/doc/refman/5.6/en/example-maximum-row.html

1<1 falsz - > s2.article = null - czyli wypisujemy s1.article, s1.dealer, s1.price
1<2 prawda - > s2.article = "wartosc" czylinie wypisujemy
1<3 prawda - > s2.article = "wartosc" czyli nie wypisuje
2<1 falsz - > s2.article = "null" czyli wypisujemy
Czyli juz blad, bo mial byc tylko jeden wiersz wypisany.

Przepraszam, tak mialo byc. Przepraszam rowniez za literowki, ale pisalem na szybkiego.
ta pseudo tabela to wyjscie.

0

Żebyś mógł to szybko zrozumieć z tego zapytania usunę warunek po WHERE oraz zmienię listę zwracanych pól:

SELECT s1.article,s1.dealer,s1.price,s2.article,s2.dealer,s2.price
FROM shop s1
LEFT JOIN shop s2 ON s1.price < s2.price;

Powyższe zapytanie do każdego artykułu z s1 dowiązuje artykuł z s2 gdzie cena s1 jest niższa od s2 i zwraca takie dane:

s1.article s1.dealer s1.price s2.article s2.dealer s2.price
0001 A 1 0002 B 2
0001 A 1 0003 C 3
0002 B 2 0003 C 3
0003 C 3 NULL NULL NULL
Jak widzisz w ostatniej linijce zwrócił nam najdroższy produkt i NULL, ponieważ nie istnieje produkt w tabeli s2 gdzie cena s1 jest niższa niż cena s2.

Teraz jak dodam do tego zapytania warunek WHERE zostanie:

SELECT s1.article,s1.dealer,s1.price,s2.article,s2.dealer,s2.price
FROM shop s1
LEFT JOIN shop s2 ON s1.price < s2.price
WHERE s2.article IS NULL;

a z danych zostanie właśnie tylko ta ostatnia linijka:

s1.article s1.dealer s1.price s2.article s2.dealer s2.price
0003 C 3 NULL NULL NULL

i w ten sposób mamy tylko najdroższy produkt z tabeli s1.

0

Dzieki, juz rozumiem. bylem w bledzie poniewaz myslalem, ze sprawdzanie bedzie kazdy z kazdym, tzn
1<1 , 1<2 , 1<3,
2<1, 2<2 , 2<3
3<1 , 3<2 , 3<3

a nie tak jak to sie faktycznie odbywa, czyli :

1<2 , 1<3
2<3
3<3

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