Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Złożone zapytanie "SELECT"
Forum PHP.pl > Forum > Przedszkole
Andrzej.W.
  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.
poli25
Jestes pewien że jest dobrze sformułowane "....from tabela,tabela,tabela..."? wg mnie nie jest to poprawne
Andrzej.W.
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.
mmmmmmm
wstaw przed zapytaniem:
  1. SET @@session.sql_mode='ONLY_FULL_GROUP_BY';

Potem doczytaj...
Dobra, oszczędzę ci. Brak GROUP BY
poli25
hehe zakręcony jesteś Panie Andrzeju wink.gif niech Pan powie jakie tabele ma pan i co w nich jest a odpowiedz będzie bardzo prosta jak to zrobic
Andrzej.W.
@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.
mmmmmmm
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
Andrzej.W.
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?



poli25
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


wink.gif bedzie dzialac
Andrzej.W.
Dzięki poli..
Działa, nawiasem mówiąc banalne heh
Miłego popołudnia.
Andrzej.
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.