Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MYSQL] Trudne zapytania
--reno--
post 23.09.2008, 11:07:09
Post #1





Goście







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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
Pilsener
post 23.09.2008, 12:25:17
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


  1. SELECT sum(nazwa_pola) FROM nazwa_tabeli WHERE nazwa_pola='Przychody'
Go to the top of the page
+Quote Post
--reno--
post 23.09.2008, 12:36:32
Post #3





Goście







  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?
Go to the top of the page
+Quote Post
--reno--
post 23.09.2008, 13:41:20
Post #4





Goście







  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 ?
Go to the top of the page
+Quote Post
sf
post 23.09.2008, 14:14:14
Post #5





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


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


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
--reno--
post 23.09.2008, 21:50:58
Post #6





Goście







nikt naprawde nie wie??
Go to the top of the page
+Quote Post
melkorm
post 23.09.2008, 23:01:00
Post #7





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


  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

Ten post edytował melkorm 24.09.2008, 00:23:59


--------------------
Go to the top of the page
+Quote Post
sf
post 24.09.2008, 07:57:52
Post #8





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


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.


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
--reno--
post 24.09.2008, 08:10:33
Post #9





Goście







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...
Go to the top of the page
+Quote Post
--reno--
post 24.09.2008, 08:47:55
Post #10





Goście







Temat do zamkniecia poradzilem sobie z tym... pozdro i thx za wskazowki
Go to the top of the page
+Quote Post
--reno--
post 24.09.2008, 12:42:57
Post #11





Goście







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 ?
Go to the top of the page
+Quote Post
melkorm
post 24.09.2008, 12:48:37
Post #12





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


  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.


--------------------
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: 13.08.2025 - 23:15