Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> zapytanie sumujace po 3 tablicach
ChrisB
post
Post #1





Grupa: Zarejestrowani
Postów: 73
Pomógł: 4
Dołączył: 13.01.2004
Skąd: Bielsko-Biała

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


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


Ten post edytował ChrisB 6.03.2009, 12:28:27
Go to the top of the page
+Quote Post
vsemak
post
Post #2





Grupa: Zarejestrowani
Postów: 22
Pomógł: 2
Dołączył: 3.03.2009

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


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.
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: 23.08.2025 - 04:44