Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Jak uprościć to zapytanie?
SmokAnalog
post
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
Go to the top of the page
+Quote Post
tomi1985
post
Post #2





Grupa: Zarejestrowani
Postów: 192
Pomógł: 12
Dołączył: 23.09.2010
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


poczytaj o funkcji

  1. INNER JOIN


Go to the top of the page
+Quote Post
SmokAnalog
post
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.
Go to the top of the page
+Quote Post
Damonsson
post
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.
Go to the top of the page
+Quote Post
SmokAnalog
post
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
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


A to nie wystarczy?
  1. SELECT
  2. u.*,
  3. count(p.id) AS payments_count,
  4. coalesce(sum(p.`amount`), 0) AS payments_total,
  5. count(o.id) AS orders_count,
  6. coalesce(sum(o.`price`), 0) AS orders_total
  7. FROM users u
  8. JOIN payments p ON(p.user_id = u.id)
  9. JOIN orders o ON(o.user_id = u.id)
  10. GROUP BY u.id
  11. ORDER BY `u`.`register_date` DESC


PS. Pewnie to bzdura ale nie mam jak przetestować ;P
Go to the top of the page
+Quote Post
SmokAnalog
post
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.
Go to the top of the page
+Quote Post
Pyton_000
post
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.
Go to the top of the page
+Quote Post
SmokAnalog
post
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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.09.2025 - 04:30