Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Zapytanie MYSQL
krzesik
post
Post #1





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

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


Witam,
może dziwnie to zabrzmi, ale mam zapytanie które kiedyś działało poprawnie, a od pewnego momentu zgłasza mi problem że występuje w nim nieznane pole [SALDO].
Próbowałem zdiagnozować problem, ale niestety bezskutecznie. Proszę o pomoc o sam już włosy z głowy rwę....
EDIT
właśnie odkryłem, że zapytanie wykonuje się poprawnie na serwerze MYSQL55, a błąd występuje na Mariadb8

  1. SELECT name, telefon, saldo FROM
  2. (
  3. SELECT * FROM
  4. (
  5. SELECT name, saldo FROM
  6. (
  7. SELECT tab2.imie_nazwisko AS name, tab2.masa AS masa, round((COALESCE(xx.kwota,0)-SUM(saldo)),2) AS saldo, SUM(kwota) AS kwota
  8. FROM
  9. (
  10. SELECT imie_nazwisko, masa, cena, przeznaczenie, zwrot, ilosc,
  11. case when waluta='' && przeznaczenie='Punkty' then (cena*masa*ilosc)
  12. when waluta='' && przeznaczenie='Osobiste' then (-(cena*masa*ilosc)*0)
  13. else 0 end AS saldo
  14. FROM (
  15. SELECT ryczalt, imie_nazwisko AS imie_nazwisko, masa AS masa, cena AS cena, zwrot AS zwrot, waluta AS waluta, przeznaczenie AS przeznaczenie, id_book AS id_book, ilosc AS ilosc, end_pol AS end_pol FROM shot_new WHERE end_pol<='2022-05-09'
  16. ) AS tab1
  17. ) AS tab2
  18. LEFT JOIN (
  19. SELECT SUM(kwota) AS kwota, imie_nazwisko, rodzaj FROM kasa WHERE data<='2022-09-05' AND (`data`>=(SELECT MAX(`data`) FROM kasa WHERE rodzaj='BS' AND rodzaj !='BK' AND rodzaj !='BB' AND koszty!='1')) GROUP BY imie_nazwisko
  20. ) xx ON xx.imie_nazwisko=tab2.imie_nazwisko GROUP BY tab2.imie_nazwisko
  21. ) ZZZ
  22. UNION SELECT imie_nazwisko, (SUM(kwota)) FROM kasa WHERE (data<='$data_do' AND kasa.imie_nazwisko NOT IN (SELECT imie_nazwisko FROM shot_new ) AND (`data`>=(SELECT MAX(`data`) FROM kasa WHERE rodzaj='BS' AND rodzaj !='BK' AND rodzaj !='BB' AND koszty!='1'))) AND koszty <>1 GROUP BY imie_nazwisko
  23. ) AS tab3 ORDER BY tab3.name
  24. ) AS tab4
  25. LEFT JOIN uzytkownik ON tab4.name = uzytkownik.login WHERE telefon!='' AND saldo < 0 ORDER BY tab4.name ASC
  26.  
  27.  
  28.  
  29.  


z tego co zauważyłem to problemem jest na samym końcu "and saldo < 0" - bez tego zapytanie się wykonuje.

Ten post edytował krzesik 10.05.2022, 11:08:55
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




To zapytanie wyglada strasznie, juz dawno takiego potworka nie widzialem i na pewno mi osobiscie nie chce sie go analizowac, ale jesli to SALDO pochodzi z jakiegos podzapytania, to powinno byc tak:
podzapytanie.saldo < 0
np:
tab2.saldo < 0

Oczywiscie ja nie wiem czy to pochodzi z tab2 czy nie, tylko mowie ze musisz okreslic skad to saldo ma sie wziasc.


Go to the top of the page
+Quote Post
krzesik
post
Post #3





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

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


tak też już próbowałem, niestety bez skutku. Zastanawiam mnie fakt że w starszej wersji MYSQL działa poprawnie
Go to the top of the page
+Quote Post
vokiel
post
Post #4





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Przy tak wielu zagnieżdżonych selektach dodaj aliasy do tabel będzie pewniej i czytelniej.

Poza tym, baza powinna Ci zwrócić w której linii jest błąd i jaki to jest błąd.
Go to the top of the page
+Quote Post
trueblue
post
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Swoją drogą, ten CASE można uprościć do:
  1. IF(waluta='' AND przeznaczenie='Punkty', cena*masa*ilosc, 0) AS saldo

Go to the top of the page
+Quote Post
krzesik
post
Post #6





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

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


ciekawostką jest to że jeśli w ostatniej linii:
  1. LEFT JOIN uzytkownik ON tab4.name = uzytkownik.login WHERE telefon!='' AND saldo < 0 ORDER BY tab4.name ASC


usunę saldo < 0 zapytanie działa poprawnie
jeśli zmienię tab4.name ASC na tab4.saldo ASC i usunę saldo < 0 to też działa dobrze
Problemem jest warunek saldo < 0 (IMG:style_emoticons/default/sad.gif)

Cytat(trueblue @ 10.05.2022, 14:39:21 ) *
Swoją drogą, ten CASE można uprościć do:
  1. IF(waluta='' AND przeznaczenie='Punkty', cena*masa*ilosc, 0) AS saldo

ten CASE jest większy, na potrzeby prezentacji uciąłem go
Go to the top of the page
+Quote Post
trueblue
post
Post #7





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Zgodnie z sugestią poprzedników, pokaż treść błędu.
Go to the top of the page
+Quote Post
krzesik
post
Post #8





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

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


Cytat(trueblue @ 10.05.2022, 14:50:17 ) *
Zgodnie z sugestią poprzedników, pokaż treść błędu.


#1054 - Nieznana kolumna 'saldo' w order clause

i uporządkowane zapytanie
  1. SELECT name, telefon, saldo FROM
  2. (
  3. SELECT * FROM
  4. (
  5. SELECT name, saldo FROM
  6. (
  7. SELECT tab2.imie_nazwisko AS name, tab2.masa AS masa, round((COALESCE(xx.kwota,0)-SUM(saldo)),2) AS saldo, SUM(kwota) AS kwota
  8. FROM (SELECT imie_nazwisko, masa, cena, przeznaczenie, zwrot, ilosc,
  9. case when waluta='' && przeznaczenie='Punkty' then (cena*masa*ilosc)
  10. when waluta='' && przeznaczenie='Osobiste' then (-(cena*masa*ilosc)*0)
  11. else 0 end AS saldo
  12. FROM (SELECT ryczalt, imie_nazwisko AS imie_nazwisko, masa AS masa, cena AS cena, zwrot AS zwrot, waluta AS waluta, przeznaczenie AS przeznaczenie, id_book AS id_book, ilosc AS ilosc, end_pol AS end_pol FROM shot_new WHERE end_pol<='2022-05-09') AS tab1
  13. ) AS tab2
  14. LEFT JOIN (SELECT SUM(kwota) AS kwota, imie_nazwisko, rodzaj FROM kasa WHERE data<='2022-09-05' AND (`data`>=(SELECT MAX(`data`) FROM kasa WHERE rodzaj='BS' AND rodzaj !='BK' AND rodzaj !='BB' AND koszty!='1')) GROUP BY imie_nazwisko ) xx ON xx.imie_nazwisko=tab2.imie_nazwisko GROUP BY tab2.imie_nazwisko
  15. ) ZZZ
  16. UNION SELECT imie_nazwisko, (SUM(kwota)) FROM kasa WHERE (data<='$data_do' AND kasa.imie_nazwisko NOT IN (SELECT imie_nazwisko FROM shot_new ) AND (`data`>=(SELECT MAX(`data`) FROM kasa WHERE rodzaj='BS' AND rodzaj !='BK' AND rodzaj !='BB' AND koszty!='1'))) AND koszty <>1 GROUP BY imie_nazwisko
  17. ) AS tab3 ORDER BY tab3.name
  18. ) AS tab4
  19. LEFT JOIN uzytkownik ON tab4.name = uzytkownik.login WHERE telefon!='' AND saldo < 0 ORDER BY tab4.name ASC


Ten post edytował krzesik 10.05.2022, 17:28:41
Go to the top of the page
+Quote Post
phpuser88
post
Post #9





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

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


Nie jestem pewny, ale spróbuj zmienić to:
  1. SELECT tab2.imie_nazwisko AS name, tab2.masa AS masa, round((COALESCE(xx.kwota,0)-SUM(saldo)),2) AS saldo, SUM(kwota) AS kwota

na to:
  1. SELECT (tab2.imie_nazwisko AS name, tab2.masa AS masa, round((COALESCE(xx.kwota,0)-SUM(saldo)),2) AS saldo, SUM(kwota) AS kwota)

Go to the top of the page
+Quote Post
krzesik
post
Post #10





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

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


Cytat(phpuser88 @ 10.05.2022, 18:33:00 ) *
Nie jestem pewny, ale spróbuj zmienić to:
  1. SELECT tab2.imie_nazwisko AS name, tab2.masa AS masa, round((COALESCE(xx.kwota,0)-SUM(saldo)),2) AS saldo, SUM(kwota) AS kwota

na to:
  1. SELECT (tab2.imie_nazwisko AS name, tab2.masa AS masa, round((COALESCE(xx.kwota,0)-SUM(saldo)),2) AS saldo, SUM(kwota) AS kwota)

niestety....

#1064 - Something is wrong in your syntax obok 'AS name, tab2.masa AS masa, round((COALESCE(xx.kwota,0)-SUM(saldo)),2) AS sal...' w linii 3
Go to the top of the page
+Quote Post
trueblue
post
Post #11





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Cytat(krzesik @ 10.05.2022, 18:22:33 ) *
#1054 - Nieznana kolumna 'saldo' w order clause

W order clause?
Go to the top of the page
+Quote Post
krzesik
post
Post #12





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

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


Cytat(trueblue @ 11.05.2022, 08:25:08 ) *
W order clause?

Taki otrzymuję komunikat....
Go to the top of the page
+Quote Post
trueblue
post
Post #13





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


A na pewno próbowałeś dodać aliasy?
Czyli:
  1. WHERE tab4.telefon!='' AND tab4.saldo < 0



A początek tak:
  1. SELECT tab4.name, tab4.telefon, tab4.saldo FROM


Ten post edytował trueblue 11.05.2022, 08:58:46
Go to the top of the page
+Quote Post
krzesik
post
Post #14





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

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


Cytat(trueblue @ 11.05.2022, 09:57:29 ) *
A na pewno próbowałeś dodać aliasy?
Czyli:
  1. WHERE tab4.telefon!='' AND tab4.saldo < 0



A początek tak:
  1. SELECT tab4.name, tab4.telefon, tab4.saldo FROM


tak, próbowałem błąd dalej taki sam.
Zauważyłem dodatkowo, że jeśli dodam ten warunek po ZZZ to przechodzi, oczywiście to co mam później po UNION mam źle (bo bez warunku), ale może to będzie jakiś trop?
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: 25.08.2025 - 19:45