Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] LEFT JOIN
peter13135
post
Post #1





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


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.


--------------------
:)
Go to the top of the page
+Quote Post
poli25
post
Post #2





Grupa: Zarejestrowani
Postów: 239
Pomógł: 20
Dołączył: 19.02.2010

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


trudno z pamieci to rozwiazac jakbys przeslal tabele z danymi i jaki wynik chcesz uzyskac??
Go to the top of the page
+Quote Post
peter13135
post
Post #3





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


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"

Ten post edytował peter13135 8.03.2012, 12:57:52


--------------------
:)
Go to the top of the page
+Quote Post
poli25
post
Post #4





Grupa: Zarejestrowani
Postów: 239
Pomógł: 20
Dołączył: 19.02.2010

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


kiedy doslesz te dane z bazy bo juz utworzylem szkielet tabel ale nie mam ndadal danych i nie wiem co chce osiągnac
Go to the top of the page
+Quote Post
peter13135
post
Post #5





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


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.


--------------------
:)
Go to the top of the page
+Quote Post
poli25
post
Post #6





Grupa: Zarejestrowani
Postów: 239
Pomógł: 20
Dołączył: 19.02.2010

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


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

Ten post edytował poli25 8.03.2012, 13:23:52
Go to the top of the page
+Quote Post
Niktoś
post
Post #7





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował Niktoś 8.03.2012, 15:02:29
Go to the top of the page
+Quote Post
peter13135
post
Post #8





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


WYkonałem 2 pierwsze zapytania, skleilem odtrzymane wynikii array_mergem i jest git biggrin.gif
Dzięki za pomoc.


--------------------
:)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 01:58