Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] Złożone zapytanie "SELECT"
-Andrzej.W.-
post
Post #1





Goście







  1. SELECT
  2. nazwa_domeny, data_s_domeny, data_k_domeny, pr_domeny, sum(przychod) AS p, sum(koszt) AS k
  3. FROM
  4. domeny, przychody, koszty
  5. WHERE
  6. domeny.id_domeny=1 AND przychody.id_domeny=1 AND koszty.id_domeny


Powyższe zapytanie teoretycznie jest prawidłowe, ponieważ sql nie wywala błędu, natomiast w każdej kolumnie wywala mi null, mimo że kiedy wykonam osobno select kolumn pierwszej tabeli i sum kolejnych tabel, zwraca poprawne wyniki. Nie wiem w czym leży problem, jeszcze nie zgłębiałem sql, jestem póki co na etapie php, proszę o jakieś wskazówki.
Pozdrawiam.
Andrzej.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
poli25
post
Post #2





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

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


Jestes pewien że jest dobrze sformułowane "....from tabela,tabela,tabela..."? wg mnie nie jest to poprawne
Go to the top of the page
+Quote Post
-Andrzej.W.-
post
Post #3





Goście







Jak pisałem temat, tabela przychody była pusta, gdy dodałem do niej parę rekordów, to już nie było null, ale sumy wyszły kosmiczne.
Natomiast domyślam się, że to jest bubel, ale nie mam pojęcia jak to sformuować. ;/

Robiłem to samo zapytanie z inner join i też jakieś dziwne przeliczenia wychodziły. Coś mi umyka, nie wiem co.

Ten post edytował Andrzej.W. 22.05.2013, 08:08:58
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


wstaw przed zapytaniem:
  1. SET @@session.sql_mode='ONLY_FULL_GROUP_BY';

Potem doczytaj...
Dobra, oszczędzę ci. Brak GROUP BY
Go to the top of the page
+Quote Post
poli25
post
Post #5





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

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


hehe zakręcony jesteś Panie Andrzeju (IMG:style_emoticons/default/wink.gif) niech Pan powie jakie tabele ma pan i co w nich jest a odpowiedz będzie bardzo prosta jak to zrobic
Go to the top of the page
+Quote Post
-Andrzej.W.-
post
Post #6





Goście







@mmmmmmm nie mam pojęcia co mam z tym zrobić.

@poli25 Nie zakręcony, znam sql tylko w podstawowych podstawach.

zrobiłem sobie 3 przykładowe tabele:

domeny
id_domeny|nazwa_domeny|
--------------------------------

koszty
id_koszty|koszt(wartosc)|id_domeny|
------------------------------------------

przychody
id_przychody|przychod(wartosc)|id_domeny|
-----------------------------------------

I teraz chciałbym wydostać jednym zapytaniem id_domeny, nazwa_domeny, sum(koszt), sum(przychod).
wg. oczywiscie id domeny

próbowałem tak:
  1. SELECT id_domeny, nazwa_domeny, sum(koszt), sum(przychod)
  2. FROM domeny
  3. LEFT JOIN koszt ON domeny.id_domeny=koszt.id_domeny
  4. RIGHT JOIN przychody ON domeny.id_domeny=przychody.id_domeny
  5. GROUP BY id_domeny


wszystko ładnie pieknie, ale sum zwraca mi jakies 50-60 tys, podczas gdy faktyczna wartosc sum wynosi 120 i 450
Wszystko dobrze działa, jeśli dam tylko np. sum(koszt), ale jak są dwie sumy w 1 zapytaniu, to już jakaś masakra. Dawałem z aliasami, też guzik dało.

Ten post edytował Andrzej.W. 22.05.2013, 11:58:39
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #7





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Błąd na etapie projektowania tabel i zależności. Jeśli masz dwie tabelki jako przychód / rozchód, to musisz mieć dwa zapytania do sumowania. Inaczej ci wyjdzie kicha. Albo bardzo skomplikowane zapytania.
Po drugi unikaj mieszania LEFT / RIGHT - nawet zaawansowani się pogubią, a co dopiero początkujący.

Na szybko do poprawienia (wcale nie znaczy, że szybko do wyliczenia)
  1. SELECT d.id_domeny, d.nazwa_domeny, sum(case rodzaj='przychod' then wartosc end) przychod, sum(case when rodzaj='koszt' then wartosc end) koszt FROM
  2. domeny d LEFT JOIN (SELECT id_domeny, 'przychod' rodzaj, przychod wartosc FROM przychody UNION SELECT id_domeny, 'koszt', koszt FROM koszt) w ON d.id_domeny=w.id_domeny
  3. GROUP BY 1,2
Go to the top of the page
+Quote Post
-Andrzej.W.-
post
Post #8





Goście







Cytat(mmmmmmm @ 22.05.2013, 13:16:02 ) *
Błąd na etapie projektowania tabel i zależności. Jeśli masz dwie tabelki jako przychód / rozchód, to musisz mieć dwa zapytania do sumowania. Inaczej ci wyjdzie kicha. Albo bardzo skomplikowane zapytania.
Po drugi unikaj mieszania LEFT / RIGHT - nawet zaawansowani się pogubią, a co dopiero początkujący.

Sugerujesz zatem, że jeśli już decyduję się na dwie osobne tabele, w takim układzie, to lepszym rozwiązaniem sa jednak osobne zapytania?

Ciągle natrafiam na tezę, że jeśli coś się da zrobić jednym zapytaniem, to zawsze to jest lepsze rozwiązanie niż w kilku.

A tak w skrócie, jaka zatem jest różnica między left/right join?



Go to the top of the page
+Quote Post
poli25
post
Post #9





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

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


uzyj podzapytan:

SELECT a.id_domeny,a.nazwa_domeny,
(select sum(koszt) from koszty where id_domeny=a.id_domeny)as koszt,
(select sum(przychody) from przychody where id_domeny=a.id_domeny)as przychod

FROM domeny a


(IMG:style_emoticons/default/wink.gif) bedzie dzialac
Go to the top of the page
+Quote Post
-Andrzej.W.-
post
Post #10





Goście







Dzięki poli..
Działa, nawiasem mówiąc banalne heh
Miłego popołudnia.
Andrzej.
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: 24.08.2025 - 16:47