Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zapytanie sumujace po 3 tablicach
Forum PHP.pl > Forum > Bazy danych > MySQL
ChrisB
witam ponownie dzisiaj;]

mam 3 tablice (uproszczone):
a) notowania - z kursami (id_not,kurs) id_not klucz podstawowy
B) p_mini - z sumą wartosci (id_uzyt,wartosc) id_uzyt klucz podstawowy
c) p_mini_poz - z pozycjami (id_not,id_uzyt,ilosc) id_not/id_uzyt - mogą się powtarzać (jeden id_uzyt może mieć wiele pozycji)

potrzebuję wybrać z tablicy C wszystkie pozycje wg id_uzyt, przemnozyc z tablicą A po kluczu id_not, z sumować po id_uzyt i przypisać do tablicy B to pola wartosc.

  1. SELECT id_uzyt,sum((kurs*ilosc)) AS wartosc FROM p_mini_poz,notowania WHERE p_mini_poz.id_not=notowania.id_not GROUP BY id_uzyt


zwraca mi to co chcę przypisane w formie id_uzyt,wartosc - tyle że zamiast wyświetlać potrzebuję to odrazu zapisać do tablicy B
probowałem

  1. UPDATE p_mini,notowania,p_mini_poz SET p_mini.wartosc=sum(kurs*ilosc) WHERE p_mini.id_uzyt=p_mini_poz.id_uzyt AND p_mini_poz.id_not=notowania.id_not GROUP BY id_uzyt


ale coś z tym group by przy update nie ten tego - wyskakuje błąd :/

ktoś ma jakiś pomysł jak to zrobić jednym zapytaniem (bez wykorzystywania php)

i dodatkowo problem nr 2
tablica A docelowo będzie wyglądać
a) z kursami (id_not,kurs_A,kurs_B) id_not klucz podstawowy
jak zrobić by jeśli pole "kurs_A"==0 - brał do zapytania pole "kurs_B"

pozdrawiam

obszedłem problem tworząc tablice tymczasową która przechowuje wynik z pierwszego zapytania i potem wg niej uaktualniana jest druga tablica
pytanie - na ile to jest optymalne i czy można lepiej bo zapytanie to będzie operować na sporej ilości danych i dosyć często.
i nadal nie wiem jak rozwiązać część drugą.

  1. INSERT INTO temp (id_uzyt,wartosc) SELECT id_uzyt,sum(kurs*ilosc) AS wartosc FROM p_mini_poz,notowania WHERE p_mini_poz.id_not=notowania.id_not GROUP BY id_uzyt
  2. UPDATE p_mini,temp SET p_mini.wartosc=temp.wartosc+gotowka WHERE p_mini.id_uzyt=temp.id_uzyt
  3. DELETE FROM temp
vsemak
Próbuj raczej czegoś takiego
  1. UPDATE p_mini,notowania,p_mini_poz SET p_mini.wartosc= (SELECT sum((kurs*ilosc)) FROM p_mini_poz,notowania WHERE p_mini_poz.id_not=notowania.id_not)
  2. WHERE p_mini.id_uzyt=p_mini_poz.id_uzyt AND p_mini_poz.id_not=notowania.id_not GROUP BY id_uzyt


Z reguły stosuje sie dwa zapytania, jest w większości przypadków szybciej.
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.