Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] LEFT JOIN
Forum PHP.pl > Forum > Przedszkole
peter13135
Mam takie zapytanko do bazy:

  1. SELECT p.*, count(o.id) AS num_orders,
  2. sum(o.refEarn) AS sum_orders,
  3. GROUP_CONCAT( o.id) AS ids
  4. FROM `partners` p
  5. LEFT JOIN `order` o ON o.ref=p.id AND o.refEarn>0
  6.  
  7. GROUP BY p.id


Powyższe zapytanie działa jak trzeba.

Mam też inne zapytanko, które różni się tylko jednym warunkiem (brak "AND o.refEarn>0 " ):

  1. SELECT p.*, count(o.id) AS num_orders,
  2. sum(o.refEarn) AS sum_orders,
  3. GROUP_CONCAT( o.id) AS ids
  4. FROM `partners` p
  5. LEFT JOIN `order` o ON o.ref=p.id
  6.  
  7. GROUP BY p.id


To zapytanie również działa poprawnie. Wyniki są inne niż w pierwszym zapytaniu.

Następnie chciałbym te powyższe zapytania połączyć w jedno. Robię to w ten sposób :

  1. SELECT p.*,
  2. count(o.id) AS num_orders,
  3. count(o2.id) AS num_orders_all,
  4. sum(o.refEarn) AS sum_orders,
  5. GROUP_CONCAT( o.id) AS ids,
  6. GROUP_CONCAT( o2.id) AS ids2
  7. FROM `partners` p
  8. LEFT JOIN `order` o ON o.ref=p.id AND o.refEarn>0
  9. LEFT JOIN `order` o2 ON o2.ref=p.id
  10. GROUP BY p.id


Jak widać, "doklejam" left joinem 2-krotnie dane z jednej tabeli, zmieniając tylko "warunki".
Niestety wyniki jakie to zapytanie zwraca nie są zgodne z moimi oczekiwaniami.
W skrócie mówiąc to :
  1. count(o.id) AS num_orders,
  2. count(o2.id) AS num_orders_all,

Daje mi idenytyczne wyniki. Z ids i ids2 jest tak samo. Gdy odpalam tamte (dwa pierwsze) zapytania osobno, wyniki są różne, czyli takie chce mieć.
To :
  1. LEFT JOIN `order` o ON o.ref=p.id AND o.refEarn>0

działa tak samo jak:
  1. LEFT JOIN `order` o2 ON o2.ref=p.id

A nie powinno tak być, bo przecież są różne "warunki" w "o" i "o2".

W jaki sposób rozwiązać mój problem ?


@up

Heloł programiści. Starałem się dokładnie opisać problem. Czy coś jest niejasnego, że nie potraficie mi pomóc tongue.gif ? Jeśli tak to proszę napisać, podam więcej szczegółów, czy tam wyłumaczę problem.
poli25
trudno z pamieci to rozwiazac jakbys przeslal tabele z danymi i jaki wynik chcesz uzyskac??
peter13135
NO.. dałem dwa działające zapytania i napisałem, że chce je połączyć w jedno zapytanie. Wydaje mi się, że i bez zrzutu bazy da się to rozwiązać, bo wszystko opisałem... no ale skoro to ma Ci pomóc, to za chwilę wkleje.

  1. CREATE TABLE IF NOT EXISTS `order` (
  2. `id` int NOT NULL AUTO_INCREMENT,
  3. (...)
  4. `ref` int NOT NULL,
  5. `refEarn` float NOT NULL,
  6. PRIMARY KEY (`id`)
  7. );


  1. CREATE TABLE IF NOT EXISTS `partners` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT
  3. (...)
  4. PRIMARY KEY (`id`)
  5. ) ;


Zosawiłem tylko te kolumny, które występują w zapytaniu.

Edit://

Powiem po co są te tabele.

Tabela orders to zamówienia. kolumna Ref, to id partnera (osoby) przez którą to zamówienie zostało wykonane. w refEarns są zarobki jakie zostały przyznane partnerowi za dane zamówienie.

Pierwsze zapytanie, pobiera mi informacje na temat zamówień zrealizowanych, to znaczy takich w których partner zarobił (co się objawia tym, że pole refEarns jest >0 )
Więc mam coś takiego:
Kod
id partnera | ilość zamówień zrealizowanych|  suma jaką partner zarobił | idki zamówień  
1                               3                                        123                                 3,6,8
2                               1                                          32                                  2

Drugie zapytanie, jest podobne. Różni się tylko tym, że pobiera wszystkie zamówienia, a nie tylko te zrealizowane. No i nie interesuje mnie w tym przypadku suma.
Przykładowy wynik:
Kod
id partnera | ilość zamówień wszystkich |  idki zamówień  
1                               5                             3,6,8,10,20
2                               2                               2,5


Teraz chciałbym połączyć te zapytania tak, by jedno zapytanie zwróciło mi, ile mam zamówień wszystkich, ile zamówień zrealizowaych, idki zamówień wszystkich, idki zamóień zrealizowanych oraz suma zamówień zrealziowanych. Niesetety moje zapytanko nie działa, napisałem w pierwszym poście jakie są objawy "niedziałąnia"
poli25
kiedy doslesz te dane z bazy bo juz utworzylem szkielet tabel ale nie mam ndadal danych i nie wiem co chce osiągnac
peter13135
Myślę, że jakbyś znał się na rzeczy, to byś wiedziałbiggrin.gif


daj sobie do partners idki np 1,2

do orders daj pare rekordów, gdzie ref będzie miało wartość 1 lub 2
w refEarn daj w klilku rekordach 0, a w kilku jakąs "kwotę" np. 10, 20, 32.45. To nie ma znaczenia.

No i generalnie wszystko masz opisane wyżej.
poli25
musisz uzyc pierwszego zapytania ktore jest dobre i potem uzyd podzapytanc z drugiet tabeli


np. select a.id_partnera, inna_kolumna,jeszcze_inna,(tutaj podzapytanie np select count(order) from tabela 2 where id_partnera=a.id_partnera)
from pierwsza tabela a

kolego jak Ci idzie ?

sprobuj to:
SELECT p.id, count(o.id) AS num_orders,

sum(o.refEarn) AS sum_orders,

GROUP_CONCAT( o.id) AS ids,

(SELECT sum(refearn) AS num_orders

FROM `partners` p

LEFT JOIN `order` o ON o.ref=p.id

and p.id=p.id) as num_orders_partner,

(SELECT count(refearn)
FROM `order` where ref=p.id) as ilosc_zamowien_wszystkich,
(SELECT count(refearn)
FROM `order` where ref=p.id and refearn>0) as ilosc_zamowien_wszystkich_pow_zero




FROM `partners` p

LEFT JOIN `order` o ON o.ref=p.id AND o.refEarn>0
Niktoś
A spróbuj tego:
  1. SELECT num_orders,num_orders_all,sum_orders FROM (
  2. SELECT p.*, count(o.id) AS num_orders,
  3.  
  4. sum(o.refEarn) AS sum_orders,
  5.  
  6. GROUP_CONCAT( o.id) AS ids
  7.  
  8. FROM `partners` p
  9.  
  10. LEFT JOIN `order` o ON o.ref=p.id
  11.  
  12.  
  13. UNION ALL
  14.  
  15.  
  16.  
  17. SELECT p.*,
  18.  
  19. count(o.id) AS num_orders,
  20.  
  21. count(o2.id) AS num_orders_all,
  22.  
  23. sum(o.refEarn) AS sum_orders,
  24.  
  25. GROUP_CONCAT( o.id) AS ids,
  26.  
  27. GROUP_CONCAT( o2.id) AS ids2
  28.  
  29. FROM `partners` p
  30.  
  31. LEFT JOIN `order` o ON o.ref=p.id AND o.refEarn>0
  32.  
  33. LEFT JOIN `order` o2 ON o2.ref=p.id
  34. ) AS Union_table GROUP BY num_orders

Dyrektywa union mogłaby połączyć oba zapytania,jeśli się pomyliłem to niech ktoś poprawi.
peter13135
WYkonałem 2 pierwsze zapytania, skleilem odtrzymane wynikii array_mergem i jest git biggrin.gif
Dzięki za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.