Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] Trudne zapytania
Forum PHP.pl > Forum > Przedszkole
-reno-
Witam, mam problem z zapytaniem:
Mam takie tabele:
MATERIAL (id, nazwa,stan)
DOKUMENT (id, dokument, operacja, id_mat)

I nie wiem jak wykonac zapytanie ktore przy np danych w bazie.

id | nazwa | stan
1 | gruszka | 20

id | dokument | operacja | id_mat
1 | P | 10 | 1 <- P - przychod
1 | R | 5 | 1 <- R - rozchod


I zeby w wyniku otrzymac 25.
Albo same przchody 30.

Prosze o pomoc.
Pilsener
  1. SELECT sum(nazwa_pola) FROM nazwa_tabeli WHERE nazwa_pola='Przychody'
-reno-
  1. SELECT DISTINCT stan-(SELECT sum(operacja) FROM dokumenty, kartoteka WHERE dokumenty.id_kart = kartoteka.id AND rodzaj='R' )+(SELECT sum(operacja) FROM dokumenty, kartoteka WHERE dokumenty.id_kart = kartoteka.id AND rodzaj='P') AS wartosc FROM dokumenty, kartoteka WHERE dokumenty.id_kart = kartoteka.id;


Zrobilem cos takiego ale dziala jedynie jak sa jakies wartosci. Jezeli nie ma w P lub w R nic to jest (NULL) i wszystko przestaje dzialac. Jak to mozna obejsc?
-reno-
  1. SELECT (stan+sum(operacja)) AS razem, nazwa FROM dokumenty, kartoteka WHERE dokumenty.id_kart = kartoteka.id;


Wszystko oblicza ale jeżeli nie wystąpił zaden dokument daje NULL co wyniku nic nie zwraca. Jak zrobic zeby np jak zadne operacje nie wystapily przepisalo sam stan ?
sf
W postgresql to można zrobić tak :

  1. SELECT CASE WHEN sum(operacja) IS NULL THEN 0 ELSE sum(operacja) END + stan ...


W mysql pewnie jest coś takiego też winksmiley.jpg
-reno-
nikt naprawde nie wie??
melkorm
  1. SELECT IF(op.dokument='R' , o.stan - sum(op.operacja) , o.stan + sum(op.operacja)) AS wartosci,op.dokument FROM test o INNER JOIN test2 op ON (o.id=op.id_mat) WHERE o.id=1 GROUP BY dokument


gdzie test to produkty

a test2 to przychód / rozchód 

jeżeli chcesz uniknąć warunku z początku zapytania możesz dawać dla rozchodów wartości ujemne winksmiley.jpg Ogólnie jeżeli dałbyś w rozchodach dał wartości ujemne uniknąłbyś tego całego bałaganu dla każdej wartości czy przychód czy rozchód były by proste zapytania i sądze ze to jest najlepszy wybór.

Cytat
Zrobilem cos takiego ale dziala jedynie jak sa jakies wartosci. Jezeli nie ma w P lub w R nic to jest (NULL) i wszystko przestaje dzialac. Jak to mozna obejsc?


w strukturze tabeli dać domyślną wartość 0 winksmiley.jpg
sf
Cytat(melkorm @ 24.09.2008, 00:01:00 ) *
w strukturze tabeli dać domyślną wartość 0 winksmiley.jpg


Co mu to da ? smile.gif Nic. Bo jeśli nie będzie dalej wartości to NULL wynika z braku wpisów.

Rozwiązanie podałem i działa pod mysql również.

http://dev.mysql.com/doc/refman/5.0/en/con...-functions.html

Najlepiej rozchody i przychody wpisywać w osobnej kolumnie, a nie tak jak obecnie czy z minusem. Kto to słyszał by przychody i rozchody trzymać w jednej. Wystarczy spojrzeć do standardowej księgi rozchodów i przychodów.
-reno-
Zrobilem takie zapytanie:
  1. SELECT IF(d.rodzaj='R', k.stan - sum(d.operacja), k.stan + sum(d.operacja)) AS wartosc, k.indeks, k.nazwa, k.jednostka, k.grupa, k.stan FROM kartoteka AS k LEFT JOIN dokumenty AS d ON (k.id = d.id_kart) WHERE k.grupa='1' GROUP BY k.indeks


I wyniki wyswietlam tak:
  1. <?php
  2. f($rekord['wartosc'] == 0){
  3.            echo $rekord['stan'];
  4.            }else{
  5.            echo $rekord['wartosc'];                      
  6.            }
  7. ?>


Teraz wyswietla to co chce ale np. jak w bazie jest tylko samo R to zamiast to odejmowac od stanu to on dodaje... dobrze jest jedynie gdy sa R i P lub samo P.
R <- rozchod
P <- przychód

przyda sie pomoc
nie wiem czemu tak sie dzieje...
-reno-
Temat do zamkniecia poradzilem sobie z tym... pozdro i thx za wskazowki
-reno-
Jeszcze jedno mam takie zapytanie:

  1. SELECT IF(d.rodzaj='RW', k.stan - (-sum(d.operacja)), k.stan + sum(d.operacja)) AS wartosc, k.indeks, k.nazwa, k.jednostka, k.grupa, k.stan, k.id FROM kartoteka AS k LEFT JOIN dokumenty AS d ON (k.id = d.id_kart) WHERE k.grupa='1' GROUP BY k.indeks ASC LIMIT $start, $ilosc


i jak zrobic zeby nie wyswietlala sie wartosc jak jest 0 ?
melkorm
  1. <?php
  2. if($tablica['wartosc'] != 0) {}
  3. ?>


Raczej nei da się już tego zrobić z poziomu mysql'a chyba że dasz

  1. WHERE wartosc <> 0


-> tego nie jestem pewien czy zadziała.
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.