Problem z zapytaniem SQL

0

mam poniższy zestaw zapytań generujący mi tabelkę z wynikami;

$ksiega=
"SELECT ksiega.masa AS masa, ksiega.cena AS cena, ksiega.zwrot AS zwrot, ksiega.waluta AS waluta, ksiega.przeznaczenie AS przeznaczenie, ksiega.id_book AS id_book FROM ksiega
UNION ALL SELECT
ksiega.masa1 AS masa, ksiega.cena1 AS cena, ksiega.zwrot1 AS zwrot, ksiega.waluta1 AS waluta, ksiega.przeznaczenie1 AS przeznaczenie, ksiega.id_book AS id_book FROM ksiega
UNION ALL SELECT
ksiega.masa2 AS masa, ksiega.cena2 AS cena, ksiega.zwrot2 AS zwrot, ksiega.waluta2 AS waluta, ksiega.przeznaczenie2 AS przeznaczenie, ksiega.id_book AS id_book FROM ksiega";

$ksiegabook=
"SELECT imie_nazwisko, masa, cena, przeznaczenie, zwrot,
 case   when waluta='%'  && przeznaczenie='mama'  then ((cena*masa)-((cena*masa)*zwrot/100))
 		when waluta='%'  && przeznaczenie='siostra'    then (-(cena*masa)*(zwrot/100))
 		when waluta='zł' && przeznaczenie='mama'  then ((cena*masa)-(zwrot))
 		when waluta='zł' && przeznaczenie='siostra'    then (-zwrot)
        else 0 end AS saldo
  FROM ($ksiega) AS tab1
  LEFT JOIN book ON tab1.id_book=book.id_book ";

$kasap=
"SELECT imie_nazwisko, SUM(kwota) AS kwota from kasa GROUP BY imie_nazwisko";

$koniec=
"SELECT tab2.imie_nazwisko AS kto, tab2.masa AS masa, (SUM(saldo)+COALESCE(xx.kwota,0)) AS saldo, SUM(kwota) AS kwota
FROM ($ksiegabook) AS tab2
LEFT JOIN ($kasap) xx ON tab2.imie_nazwisko=xx.imie_nazwisko GROUP BY tab2.imie_nazwisko";

wszystko jest dobrze z małym ale.... może zaistnieć taka sytuacja że w tabeli tab2 nie ma nazwiska które jest w tabeli xx wtedy jest pomijane, próbowałem na różne sposoby, FULL JOIN, RIGHT JOIN wszystko na nic. Znalazłem gdzieś podobny przypadek gdzie zastosowano dodatkowo UNION, ale u mnie znów klops....

0

W cholerę długie to, chyba dajesz też masę niepotrzebnego kodu.
Wrzuć dump przykładowej bazy, powiedz o które zapytanie Ci konkretnie chodzi (ostatnie patrząc po nazwach tabel, po co zatem te wcześniejsze?) i ogólnie zrób coś, żeby patrząc na tego posta nie odechciewało się w tym grzebać ;)

0
dzek69 napisał(a):

W cholerę długie to, chyba dajesz też masę niepotrzebnego kodu.
Wrzuć dump przykładowej bazy, powiedz o które zapytanie Ci konkretnie chodzi (ostatnie patrząc po nazwach tabel, po co zatem te wcześniejsze?) i ogólnie zrób coś, żeby patrząc na tego posta nie odechciewało się w tym grzebać ;)

Tak naprawdę to jest jedno zapytanie, rozbiłem je na części bo tak jest mi to ogarnąć, a ewentualne zmiany wprowadzm w jednym elemencie. Czyli rozumiem że mam zapodać strukturę bazy?

0

Więc tak, mamy trzy tabele:
**book, ksiega kasa **(struktury poniżej),
muszę wyłowić dane z tabelki KSIEGA pokazujące mi wartości umówmy się (masa * cena) - zwrot i tak dla każdego imie_nazwisko, którego w tabeli KSIEGA nie ma, ale pobieram go z tabeli BOOK poprzez lewostronne połączenie i spełnienie warunku ksiega.id_book=book.id_book. Następnie dołączam tabelę KASA bo w niej są inne rozliczenia i znów to łączę do poprzedniego wyniku lewostronnie przy spełnionym warunku imie_nazwisko=imie_nazwisko , które muszę zsumować z poprzedniego działania i to mi działa ładnie i pięknie. Problem pojawił się gdy w tabeli KSIEGA nie ma zapisów dla danej osoby a w tabeli KASA są .....
może coś wypatrzysz czego ja nie widziałem do tej pory..

--
-- Struktura tabeli dla ksiega

CREATE TABLE ksiega (
id_ksiega int(10) NOT NULL auto_increment,
id_book varchar(10) NOT NULL,
nr_odst varchar(10) NOT NULL,
masa varchar(10) NOT NULL,
masa1 varchar(10) NOT NULL,
masa2 varchar(10) NOT NULL,
forma varchar(50) NOT NULL,
forma1 varchar(50) NOT NULL,
forma2 varchar(50) NOT NULL,
przeznaczenie varchar(50) NOT NULL,
przeznaczenie1 varchar(50) NOT NULL,
przeznaczenie2 varchar(50) NOT NULL,
cena text NOT NULL,
cena1 text NOT NULL,
cena2 text NOT NULL,
zwrot text NOT NULL,
zwrot1 text NOT NULL,
zwrot2 text NOT NULL,
waluta varchar(5) NOT NULL,
waluta1 varchar(5) NOT NULL,
waluta2 varchar(5) NOT NULL,
PRIMARY KEY (id_ksiega)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

--
-- Struktura tabeli dla book

CREATE TABLE book (
id_book int(10) NOT NULL auto_increment,
imie_nazwisko varchar(50) collate utf8_polish_ci NOT NULL,
anulowano varchar(1) collate utf8_polish_ci NOT NULL default 'N',
info text collate utf8_polish_ci NOT NULL,
data_wpisu datetime NOT NULL,
PRIMARY KEY (id_book)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;

-- Struktura tabeli dla kasa

CREATE TABLE kasa (
id_kasa int(10) NOT NULL auto_increment,
imie_nazwisko varchar(50) character set utf8 collate utf8_polish_ci NOT NULL,
kwota decimal(10,2) NOT NULL,
opis text character set utf8 collate utf8_polish_ci NOT NULL,
data date NOT NULL,
rodzaj varchar(2) character set utf8 collate utf8_polish_ci NOT NULL,
nr_kasa varchar(10) character set utf8 collate utf8_polish_ci NOT NULL,
PRIMARY KEY (id_kasa)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

0

Faktycznie jedno, nie zauważyłem tego. Przykładowe dane, żeby sobie sprawdzać też podaj.

0

--
-- Zrzut danych tabeli 'book'

INSERT INTO book VALUES(1, 'bogdan', 'N', '1', '2012-07-10 1254');
INSERT INTO book VALUES(2, 'adam' , 'N', '1', '2012-07-10 1223');
INSERT INTO book VALUES(3, 'bogdan', 'N', '2', '2012-07-10 1509');
INSERT INTO book VALUES(4, 'michał', 'N', '6', '2012-07-10 1534');
INSERT INTO book VALUES(5, 'michał', 'N', '2', '2012-07-11 1544');

--
-- Zrzut danych tabeli kasa

INSERT INTO kasa VALUES(1, 'bogdan', -420.00, 'Składka za rok 2012/2013', '2012-08-28', 'SK', '');
INSERT INTO kasa VALUES(2, 'michał', -420.00, 'Składka za rok 2012/2013', '2012-08-28', 'SK', '');
INSERT INTO kasa VALUES(3, 'kamil' , -20.00, 'Składka za rok 2012/2013', '2012-08-28', 'SK', '');
INSERT INTO kasa VALUES(4, 'marcin', -210.00, 'Składka za rok 2012/2013', '2012-08-28', 'SK', '');
INSERT INTO kasa VALUES(5, 'michał', -420.00, 'Składka za rok 2012/2013', '2012-08-28', 'SK', '');

--
-- Zrzut danych tabeli ksiega

INSERT INTO ksiega VALUES(1, '1', '1', '234', , , , , , 'własny', , , '1', '7', , , '8', , , '%', , '');
INSERT INTO ksiega VALUES(2, '2', '2', '123', '18', , , , , 'własny', ' własny', , '1', '33', '123', , '11', '5', , '%', 'zł', );
INSERT INTO ksiega VALUES(3, '3', '3', '3', , '28', , , , 'Punkt', '', ' własny', '1', '13,5', '22', '14,5', '10', '3', '0', '%', 'zł', '%');
INSERT INTO ksiega VALUES(4, '4', '4', '10', '56', '75', , , '', 'Nie dotyczy', 'Punkt', 'Punkt ', '1','10', '14,5', '12,3', '15', '10', '50', 'zł', '%', '%');
INSERT INTO ksiega VALUES(5, '5', '99', '15', , , , , , 'własny', , , '1', '14,5', , , '0', , , 'zł', , '');

1 użytkowników online, w tym zalogowanych: 0, gości: 1