![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Cześć,
mam takie oto zapytanie MySQL: Kod SELECT `u`.*, ( SELECT count(*) FROM `payments` AS `p` WHERE `p`.`user_id` = `u`.`id` ) AS `payments_count`, ( SELECT coalesce(sum(`amount`), 0) FROM `payments` AS `p` WHERE `p`.`user_id` = `u`.`id` ) AS `payments_total`, ( SELECT count(*) FROM `orders` AS `o` WHERE `o`.`user_id` = `u`.`id` ) AS `orders_count`, ( SELECT coalesce(sum(`price`), 0) FROM `orders` AS `o` WHERE `o`.`user_id` = `u`.`id` ) AS `orders_total` FROM `users` AS `u` ORDER BY `u`.`register_date` DESC Wygląda na skomplikowane, ale to po prostu wybieranie wszystkich rekordów z tabeli `users` i statystyk z połączonych dwóch innych tabel - `payments` i `orders`. Jak można to uprościć/zoptymalizować, żeby nie wyszukiwać po dwa razy z każdej z dołączonych tabel? Mile widziana podpowiedź z JOIN-ami, bo używam ORM-a i może być problem z podzapytaniami, chociaż nie dam sobie nic uciąć. (IMG:style_emoticons/default/smile.gif) P.S. Co jest z tym kolorowaniem składni? Wrzucam jako code, bo kolorowanie MySQL jakieś hieroglify mi wyrzuca. Ten post edytował SmokAnalog 30.08.2014, 15:38:34 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 192 Pomógł: 12 Dołączył: 23.09.2010 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Nie muszę czytać, znam to. Ale nie wiem jak to zastosować w tym przypadku.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 355 Pomógł: 533 Dołączył: 15.01.2010 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Czyli nie znasz.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Po pierwsze jak już to left join, a po drugie mądralo powiedz jak pogrupować to na dwie osobne kupki, żeby dla każdej osobno wyliczyć statystyki (IMG:style_emoticons/default/tongue.gif)
Ten post edytował SmokAnalog 30.08.2014, 18:35:19 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
A to nie wystarczy?
PS. Pewnie to bzdura ale nie mam jak przetestować ;P |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Pyton, dzięki! Zamieniłem JOIN na LEFT JOIN i śmiga tak jak chciałem. Faktycznie to wystarczy, bo przecież JOIN wszystkie kombinacje wytworzy i w niedopasowanych polach będzie NULL, czyli w polach z `orders` zawsze będzie NULL dla `payments` i na odwrót. Proste, zapomniałem o tym.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
JOIN wyświetla tylko relacje które są dopasowane więc nie powinno być NULL, LEFT dodaje NULL jeżeli brak w tabeli dopasowania.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 707 Pomógł: 266 Dołączył: 3.07.2012 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Racja. Ale w takim razie JOIN tu nie pasuje, bo znajduje mi tylko tych użytkowników, którzy mają przypisane zarówno zamówienia, jak i płatności. Muszę się pobawić dokładniej tymi JOIN-ami, bo o ile LEFT JOIN dobrze rozumiem, to JOIN na wielu tabelach nadal mnie czasem zaskakuje.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.09.2025 - 04:30 |