Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Znowu left joiny
kasztan
post 7.11.2003, 12:31:25
Post #1





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 9.05.2003
Skąd: Poznań

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


Cześć,
kolejny dzień ślęczenia nad zapytaniem i nic.
Wątek http://forum.php.pl/viewtopic.php?t=6692 przestudiowałem dość szczegółowo i nie potrafiłem zrobić swojego zapytania.

Mam 3 table: agenci, firmy, produkty. Chcę zliczyć ile każdy agent pozyskał produktów i firm. Nie będę rozpisywał poszczególnych atrybutów dla każdej z tabel. Wszystko widać z zapytań.
Może jednak nie widać, bo coś się nie mogę doczekać odpowiedzi. Więc powiem tylko te najważniejsze:
agents_pl: agent_id
firms_pl_transact: firm_id, agent_id
products_pl_transact: product_id, firm_id, agent_id.

Zapytanie o liczbę firm wygląda tak i działa o.k.:
[sql:1:b467487e3b]
select a.firstname 'Imię', a.lastname 'Nazwisko', count(f.agent_id) as 'Liczba firm'
from agents_pl a
left join firms_pl_transact f on (a.agent_id = f.agent_id)
WHERE
a.active_i = 1
AND
a.agent_id not in (1, 2)
group by a.agent_id
order by 'Liczba firm' desc, a.lastname;
[/sql:1:b467487e3b]

Analogicznie zapytanie o liczbę produktów wygląda tak i działa o.k.:
[sql:1:b467487e3b]
select a.firstname 'Imię', a.lastname 'Nazwisko', count(p.agent_id) as 'Liczba produktów'
from agents_pl a
left join products_pl_transact p on (a.agent_id = p.agent_id)
WHERE
a.active_i = 1
AND
a.agent_id not in (1, 2)
group by a.agent_id
order by 'Liczba produktów' desc, a.lastname;
[/sql:1:b467487e3b]

No i teraz potrzebuję zapytania, które da mi sumę tych firm i produktów.
Niestety w tej postaci, jak poniżej, dostaję co prawda jakieś wyniki, ale są bzdurne.
[sql:1:b467487e3b]
select a.firstname 'Imię', a.lastname 'Nazwisko', count(p.agent_id) + count(f.agent_id) as 'Liczba umów'
from agents_pl a
left join products_pl_transact p on (a.agent_id = p.agent_id)
left join firms_pl_transact f on (a.agent_id = f.agent_id)
WHERE
a.active_i = 1
AND
a.agent_id not in (1, 2)
group by a.agent_id
order by 'Liczba umów' desc, a.lastname
[/sql:1:b467487e3b]

Help me.


--------------------
"There are no problems, only opportunities"
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
kasztan
post 13.11.2003, 11:25:38
Post #2





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 9.05.2003
Skąd: Poznań

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


Hmm, czy naprawdę nikt nie może mi pomóc :?:


--------------------
"There are no problems, only opportunities"
Go to the top of the page
+Quote Post
uboottd
post 14.11.2003, 19:11:37
Post #3





Grupa: Zarejestrowani
Postów: 384
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Chorzow

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


Jedno zapytanie tylko z left joinami bedzie bardzo kulawe o ile nie niemozliwe. To akurat dobry przyklad na wykorzystanie podzapytan - grupowanie po roznych kryteriach.
Go to the top of the page
+Quote Post
kasztan
post 15.11.2003, 12:31:57
Post #4





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 9.05.2003
Skąd: Poznań

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


A może by tak jakaś konkretniejsza podpowiedź jak mam to zrobic?


--------------------
"There are no problems, only opportunities"
Go to the top of the page
+Quote Post
chfast
post 18.11.2003, 16:52:28
Post #5





Grupa: Zarejestrowani
Postów: 222
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Wrocław

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


Cytat
A może by tak jakaś konkretniejsza podpowiedź jak mam to zrobic?

A może jakieś bardziej zrozumiałe pytanie?
Cytat
potrzebuję zapytania, które da mi sumę tych firm i produktów

Nie rozumiem o co ci chodzi. Jak dla mnie to wychodzi tak:
liczba produktów: a
liczba firm: b
"suma tych firm i produktów": a + b .


--------------------
pozdrawiam, chfast
Go to the top of the page
+Quote Post
kasztan
post 19.11.2003, 12:13:19
Post #6





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 9.05.2003
Skąd: Poznań

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


Cytat
A może jakieś bardziej zrozumiałe pytanie?

Sorry, ale wydaje mi się, że się wyraziłem dość precyzjnie.

Cytat
Nie rozumiem o co ci chodzi. Jak dla mnie to wychodzi tak:
liczba produktów: a
liczba firm: b
"suma tych firm i produktów": a + b .

Tak, o to mi chodzi, ale mam to mieć w jednym zapytaniu! To że działa dla każdego z osobna, to mi w zasadzie niewiele daje.


--------------------
"There are no problems, only opportunities"
Go to the top of the page
+Quote Post
durzy
post 19.11.2003, 12:21:29
Post #7





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.11.2003
Skąd: Wawa

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


sprobuj uzyc UNION pomiedzy pierwszym kodem a drugim i w pierwszym usun sortowanie

Pozdrawiam
Go to the top of the page
+Quote Post
kasztan
post 19.11.2003, 14:34:58
Post #8





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 9.05.2003
Skąd: Poznań

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


Cytat
sprobuj uzyc UNION pomiedzy pierwszym kodem a drugim i w pierwszym usun sortowanie

Pozdrawiam


Tak, tylko, że zauważ, że mam w obu tych zapytaniach grupowanie i sortowanie, a jak zrobię union tych dwóch zapytań, to jak mam to pogrupować i posortować?? Jak zrobię grupowanie tak, jak jest (czyli 2 razy, to w wyniku dostanę co prawda poprawne wyniki, ale będzie się wynik składał z 2 części (najpierw wyświetleni zostaną wszyscy z pierwszego zapytania, a potem z drugiego, a ja chcę dostać jeden wynik, który będzie zawierał sumę).


--------------------
"There are no problems, only opportunities"
Go to the top of the page
+Quote Post
durzy
post 19.11.2003, 18:08:14
Post #9





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.11.2003
Skąd: Wawa

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


oki - moze bredze ale juz jestem po kilku godzinach pracy i jestem zmeczony.
probowalem "zobaczyc" Twoje tablice i mam kilka pytan:

1) dlaczego piszesz w select'cie
[sql:1:3461983a7c]SELECT a.firstname 'Imię', a.lastname 'Nazwisko'[/sql:1:3461983a7c]
czy te dwa pola maja byc osobno? czy nie lepiej napisac
[sql:1:3461983a7c]SELECT (a.firstname+' '+a.lastname) 'Imie i Nazwisko'[/sql:1:3461983a7c]

2) czy grupowanie jest napewno zrobione dobrze?
imho powinienes zrobic grupowanie po a.firstname, a.lastname lub
(a.firstname+' '+a.lastname) w obu przypadkach?

pozdrawiam
Go to the top of the page
+Quote Post
kasztan
post 19.11.2003, 19:07:28
Post #10





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 9.05.2003
Skąd: Poznań

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


Cytat
...
1) dlaczego piszesz w select'cie
[sql:1:7d7708ca46]SELECT a.firstname 'Imię', a.lastname 'Nazwisko'[/sql:1:7d7708ca46]
czy te dwa pola maja byc osobno? czy nie lepiej napisac
[sql:1:7d7708ca46]SELECT (a.firstname+' '+a.lastname) 'Imie i Nazwisko'[/sql:1:7d7708ca46]


Lepiej, nie lepiej, potrzebowałem je "oddzielnie" smile.gif. Nie wpływa to w żaden sposób na sposób rozwiązania.


Cytat
2) czy grupowanie jest napewno zrobione dobrze?
imho powinienes zrobic grupowanie po a.firstname, a.lastname lub
(a.firstname+' '+a.lastname) w obu przypadkach?
...


Generalnie musiałem po czymś grupować, ponieważ w warunku selekcji użyłem funkcji agregującej count (bez count'a wyrzuca błąd - to na wypadek jakby ktoś pytał dlaczego musi być grupowanie).
A czy nie powiniem grupować po czymś innym (a.firstname, a.lastname, tak jak proponowałeś)? - raczej nie, bo jeśli bym grupował tak, jak piszesz, to tym razem dostanę 4 "porcje wyników" (grupowanie po imieniu z 1 zapytania, grupowanie po nazwisku z 1 zapytania, grupowanie po imieniu z 2 zapytania, grupowanie po nazwisku z 2 zapytania).
Rozwiązanie musi być gdzieś blisko, ale gdzie? biggrin.gif


--------------------
"There are no problems, only opportunities"
Go to the top of the page
+Quote Post
durzy
post 20.11.2003, 11:28:13
Post #11





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 19.11.2003
Skąd: Wawa

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


szkoda ze nie napisales pod czym piszesz te zapytania. wnioskuje ze srednikow znajdujacych sie w kodzie ze jest to (chyba) mysql.

ja pracuje na mssql i Twoj problem mozna na tym rozwiazac bardzo szybko poprzez takie zapytanie:
[sql:1:0fb472fd77]
SELECT t.firstname, t.lastname, sum(t.liczba) 'Liczba produktow + umow'
FROM (SELECT a.firstname, a.lastname, count(f.agent_id) 'Liczba'
FROM agents_pl a
LEFT join firms_pl_transact f ON (a.agent_id = f.agent_id)
WHERE a.active_i = 1
AND a.agent_id NOT in (1, 2)
GROUP BY a.firstname, a.lastname,a.agent_id
UNION
SELECT a.firstname, a.lastname, count(p.agent_id) 'Liczba'
FROM agents_pl a
LEFT join products_pl_transact p ON (a.agent_id = p.agent_id)
WHERE a.active_i = 1
AND a.agent_id NOT in (1, 2)
GROUP BY a.firstname, a.lastname,a.agent_id
) t
GROUP BY t.firstname, t.lastname
ORDER BY 3 desc, 1
[/sql:1:0fb472fd77]

wydaje mi sie ze mysql obsluguje juz podzapytania. jesli nie to chyba bedziesz jednak musial to rozbic na 2 select'y

Pozdrawiam


--------------------
IIS 5.1 + PHP 4.3.4 + MSSQL 2k
Go to the top of the page
+Quote Post
kasztan
post 24.11.2003, 14:36:03
Post #12





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 9.05.2003
Skąd: Poznań

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


Cytat
szkoda ze nie napisales pod czym piszesz te zapytania. wnioskuje ze srednikow znajdujacych sie w kodzie ze jest to (chyba) mysql.

tak, MySql

Cytat
wydaje mi sie ze mysql obsluguje juz podzapytania. jesli nie to chyba bedziesz jednak musial to rozbic na 2 select'y
Pozdrawiam


Niestety, otrzymuje taki komunikat o błędzie, w sumie nie wiem, czy to jest wina błędnego zapytania, czy tego, że wersja MySql'a na której pracuję (4.0.14) nie obsługuje podzapytań.

Kod
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT a.firstname, a.lastname, count(f.agent_id) 'Liczba' FRO


--------------------
"There are no problems, only opportunities"
Go to the top of the page
+Quote Post
uboottd
post 24.11.2003, 14:47:05
Post #13





Grupa: Zarejestrowani
Postów: 384
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Chorzow

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


Mysql podzapytania obsluguje od wersji 4.1, jednakze jest to wersja poki co alfa. Produkcyjne 4.0.x nie obsluguja podzapytan.

Dlaczego nie mozesz miec tego w dwoch zapytaniach i zsumowac to tam gdzie wywolujesz ?

Co do union - zapytania zlaczone unionem moga miec rozne grupowania, tylko sortowanie jest wspolne dla calej uni, ale to tez niewiele ci da.

W zasadzie jedynym wyjscie jest tabela tymczasowa. Robisz to mniej wiecej tak:
1. CREATE TEMPORARY TABLE t(potrzebne pola)
2. INSERT INTO t SELECT <ten pierwszy select>
3. SELECT <ten drugi select, ale z doklejona tabela t>
4. DROP TABLE t
Go to the top of the page
+Quote Post
kasztan
post 24.11.2003, 15:41:34
Post #14





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 9.05.2003
Skąd: Poznań

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


Cytat
Mysql podzapytania obsluguje od wersji 4.1, jednakze jest to wersja poki co alfa. Produkcyjne 4.0.x nie obsluguja podzapytan.

Dlaczego nie mozesz miec tego w dwoch zapytaniach i zsumowac to tam gdzie wywolujesz ?


Hmm, więc jednak z podzapytaniami się nie da. A co do rozwiązania podanego przez Ciebie, to już dawno coś musiałem wymyśleć, bo potrzebowałem, żeby to zrobić. Jednak przy moim rozwiązaniu nie tworzę tymczasowej tabeli w bazie, tylko wyniki obu zapytań zapisuję w tablicy w php'ie, potem ładnie sortuję tą tablicę po jednym z jej wymiarów i odczytuję dane.
Z tym, że przy tym rozwiązaniu napotkałem kolejny problem. Otóż mam tablicę:
[php:1:098d87ff23]
<?php
$tab3 = array("id", "imie", "nazwisko", "ile_razem");
?>
[/php:1:098d87ff23]
a w niej mam zapisane to, co odczytałem przy pomocy tych moich 2 zapytań, pole ile_razem to jest suma tego co odczytałem z pierwszego zapytania i tego, co odczytałem z drugiego zapytania.
Teraz, żeby ładnie wyświetlić dane z tej tablicy muszę posortować tą tablicę.
[php:1:098d87ff23]
<?php
array_multisort($tab3["ile_razem"], SORT_DESC, SORT_NUMERIC, $tab3["id"], $tab3["imie"], $tab3["nazwisko"]);
?>
[/php:1:098d87ff23]
I tu się pojawia pewien problem, bo o ile są różne wartości w ile_razem, to wszystko jest o.k., to kiedy kilku agentów ma taką samą wartość ile_razem, to chciałbym, żeby wówczas ta tablica była posortowana wg nazwiska. Jak to zrobić?


--------------------
"There are no problems, only opportunities"
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 Wersja Lo-Fi Aktualny czas: 24.07.2025 - 16:08