Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Zapytanie MYSQL
Forum PHP.pl > Forum > Przedszkole
krzesik
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.
nospor
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.


krzesik
tak też już próbowałem, niestety bez skutku. Zastanawiam mnie fakt że w starszej wersji MYSQL działa poprawnie
vokiel
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.
trueblue
Swoją drogą, ten CASE można uprościć do:
  1. IF(waluta='' AND przeznaczenie='Punkty', cena*masa*ilosc, 0) AS saldo

krzesik
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 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
trueblue
Zgodnie z sugestią poprzedników, pokaż treść błędu.
krzesik
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
phpuser88
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)

krzesik
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
trueblue
Cytat(krzesik @ 10.05.2022, 18:22:33 ) *
#1054 - Nieznana kolumna 'saldo' w order clause

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

Taki otrzymuję komunikat....
trueblue
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
krzesik
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?
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.