Witam grupe
Czy moglby ktos looknac na ponizsze zapytanie i wytlumaczyc mi, czemu sortowanie nie jest zgodne z moimi zamierzeniami?
Moje zamierzenia sa takie: - mam sobie 2 polaczone bazy oraz trzecia podlaczona przez left outer join - taka konstrukcje chce posortowac wg daty zamowienia (malejaco), ale w taki sposob, zeby najpierw byly zamowienia konkretnego, wskazanego klienta, a dopiero potem zamowienia pozostalych klientow - wiec de facto robie 2 takie same zapytania - raz dla wskazanego klienta, a potem przez UNION lacze z takim samym, dla pozostalych. - pytanie pomocnicze - czy da sie to zrobic bez UNION ?
W efekcie dostaje "prawie" to, co chce Prawie, poniewaz owszem - pierwszym jest wybrany klient (ale posortowany rosnaca, mozna powiedziec, ze brak sortowania), a pozostali sa posortowani rosnaca wg pola klient (na czym mi kompletnie nie zalezy). jesli wykonuje osobno poszczegolne selecty - wszystko wychodzi jak nalezy
Najwyrazniej tutaj czegos nie rozumiem i nie bardzo umiem sie doczytac, o co chodzi
pelne zapytanie: ( SELECT obr.nrzam, obr.nrpoz, nag.klient, obr.nazwa, obr.ilosc, obr.datazam, obr.status, obr.cenanetto, obr.cenabrutto, sk.kwota, obr.uwagi, obr.indeks FROM zam_naglowki nag, zam_obroty obr LEFT OUTER JOIN skarbonka sk ON sk.nrzam = obr.nrzam AND sk.pozzam = obr.nrpoz WHERE nag.nrzam = obr.nrzam AND obr.nazwa LIKE '%hp%' AND obr.nazwa LIKE '%57%' AND nag.klient = 'hpp' ORDER BY obr.datazam DESC ) UNION (
SELECT obr.nrzam, obr.nrpoz, nag.klient, obr.nazwa, obr.ilosc, obr.datazam, obr.status, obr.cenanetto, obr.cenabrutto, sk.kwota, obr.uwagi, obr.indeks FROM zam_naglowki nag, zam_obroty obr LEFT OUTER JOIN skarbonka sk ON sk.nrzam = obr.nrzam AND sk.pozzam = obr.nrpoz WHERE nag.nrzam = obr.nrzam AND obr.nazwa LIKE '%hp%' AND obr.nazwa LIKE '%57%' AND nag.klient 'hpp' ORDER BY obr.datazam DESC )
Pozdrawiam Michal
MySQL nie rozumiem sortowania...
Witam grupe
Czy moglby ktos looknac na ponizsze zapytanie i wytlumaczyc mi, czemu sortowanie nie jest zgodne z moimi zamierzeniami?
Moje zamierzenia sa takie: - mam sobie 2 polaczone bazy oraz trzecia podlaczona przez left outer join - taka konstrukcje chce posortowac wg daty zamowienia (malejaco), ale w taki sposob, zeby najpierw byly zamowienia konkretnego, wskazanego klienta, a dopiero potem zamowienia pozostalych klientow - wiec de facto robie 2 takie same zapytania - raz dla wskazanego klienta, a potem przez UNION lacze z takim samym, dla pozostalych. - pytanie pomocnicze - czy da sie to zrobic bez UNION ?
W efekcie dostaje "prawie" to, co chce Prawie, poniewaz owszem - pierwszym jest wybrany klient (ale posortowany rosnaca, mozna powiedziec, ze brak sortowania), a pozostali sa posortowani rosnaca wg pola klient (na czym mi kompletnie nie zalezy). jesli wykonuje osobno poszczegolne selecty - wszystko wychodzi jak nalezy
Najwyrazniej tutaj czegos nie rozumiem i nie bardzo umiem sie doczytac, o co chodzi
pelne zapytanie: ( SELECT obr.nrzam, obr.nrpoz, nag.klient, obr.nazwa, obr.ilosc, obr.datazam, obr.status, obr.cenanetto, obr.cenabrutto, sk.kwota, obr.uwagi, obr.indeks FROM zam_naglowki nag, zam_obroty obr LEFT OUTER JOIN skarbonka sk ON sk.nrzam = obr.nrzam AND sk.pozzam = obr.nrpoz WHERE nag.nrzam = obr.nrzam AND obr.nazwa LIKE '%hp%' AND obr.nazwa LIKE '%57%' AND nag.klient = 'hpp' ORDER BY obr.datazam DESC ) UNION (
Michal AKA Miki pisze:
Wg mojej skromnej wiedzy jednym zapytaniem nie bardzo, UNION chyba musi być.
Na początek proponuję zmianę (w obu zapytaniach UNION): FROM zam_naglowki nag JOIN zam_obroty obr ON nag.nrzam = obr.nrzam LEFT OUTER JOIN skarbonka sk ON sk.nrzam = obr.nrzam AND sk.pozzam = obr.nrpoz WHERE obr.nazwa LIKE ..
co teoretycznie powinno przyspieszyć wykonywanie polecenia, gdyż najpierw łączysz tabele z pewnym warunkiem, a dopiero do nich dołączasz trzecią tabelę. Warunek połączenia u Ciebie był w WHERE, ale JOIN . ON daje to samo.
Ale sortowanie mnie zamurowało patrzę i i błędu nie widzę.
W drugim zapytaniu jeszcze mógłbym się łudzić, że z tą samą datą masz faktury/zamówienia dużej liczby klientów i tylko Ci się "wydaje" że masz nie posortowane,a widzisz ileśtam ostatnich rekordów z klientami posortowanymi wg ich nazwy, ale z tą samą datą.
W pierwszym za to bezapelacyjnie nie wiem, gdzie błąd (przyznaję bez bicia).
A.G.
Moje zamierzenia sa takie: - mam sobie 2 polaczone bazy oraz trzecia podlaczona przez left outer join - taka konstrukcje chce posortowac wg daty zamowienia (malejaco), ale w taki sposob, zeby najpierw byly zamowienia konkretnego, wskazanego klienta, a dopiero potem zamowienia pozostalych klientow - wiec de facto robie 2 takie same zapytania - raz dla wskazanego klienta, a potem przez UNION lacze z takim samym, dla pozostalych. - pytanie pomocnicze - czy da sie to zrobic bez UNION ?
Michal AKA Miki:
OczywiĹcie: ORDER BY zamowienie.klient_id = wybrany_id DESC,
Gdyby to robiÄ przez UNION, to naleĹźy pamiÄtaÄ, Ĺźe UNION nie zachowuje kolejnoĹci i ORDER BY powinen byÄ na koĹcu: (SELECT ) UNION (SELECT ) ORDER BY
..pk.
Witam grupe
Czy moglby ktos looknac na ponizsze zapytanie i wytlumaczyc mi, czemu sortowanie nie jest zgodne z moimi zamierzeniami?
Moje zamierzenia sa takie: - mam sobie 2 polaczone bazy oraz trzecia podlaczona przez left outer join - taka konstrukcje chce posortowac wg daty zamowienia (malejaco), ale w taki sposob, zeby najpierw byly zamowienia konkretnego, wskazanego klienta, a dopiero potem zamowienia pozostalych klientow - wiec de facto robie 2 takie same zapytania - raz dla wskazanego klienta, a potem przez UNION lacze z takim samym, dla pozostalych. - pytanie pomocnicze - czy da sie to zrobic bez UNION ?
W efekcie dostaje "prawie" to, co chce Prawie, poniewaz owszem - pierwszym jest wybrany klient (ale posortowany rosnaca, mozna powiedziec, ze brak sortowania), a pozostali sa posortowani rosnaca wg pola klient (na czym mi kompletnie nie zalezy). jesli wykonuje osobno poszczegolne selecty - wszystko wychodzi jak nalezy
Najwyrazniej tutaj czegos nie rozumiem i nie bardzo umiem sie doczytac, o co chodzi
Michal AKA Miki
1. UNION to łączenie zbiorów, a połączenie zbiorów o elementach 1,2 i 2,3 daje w efekcie zbiór 1,2,3. Po bazodanowemu UNION wykonuje od razu DISTINCT, a efektem ubocznym DISTINCT jest sortowanie. Sprawę rozwiązuje UNION ALL (choć teoretycznie to gwarancji na to nie ma, to w praktycy zwraca w kolejności takiej jakiej się spodziewasz).
2. Zamiast kombinować z UNION ALL robisz jedno zapytanie (bez warunku na klienta) a sortowanie robisz postaci:
ORDER BY CASE WHEN nag.klient = 'hpp' THEN 1 ELSE 2 END, obr.datazam desc