Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Złączenia wyświetlanie wyników zawsze pojedynczo
Forum PHP.pl > Forum > Bazy danych > MySQL
seeb
Mam takie zapytanie:
  1. SELECT u.id, u.name AS imie_i_nazwisko, p.nr_iban, w.kwota, w.miesiac
  2. FROM xxx_users AS u
  3. LEFT JOIN xxx_pracownicy AS p ON u.id = p.id
  4. LEFT JOIN xxx_wyplaty AS w ON p.id = w.id
  5. WHERE p.id >0
  6. AND p.Archiwalny = 'N' AND p.grupa='P'
  7. ORDER BY imie_i_nazwisko


Puki w.miesiac występuje raz lub nie występuje wcale nie ma problemów. Problemy pojawiają się w drugim (i później) miesiącu.

Wyniki zaczynają się dublować tzn. osoba pracująca w kwietniu, maju i w czerwcu ma dwa(jesli pracowacował w kwietniu trzy) wyniki.

230 Jan Kowalski PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2300] 04-2012
230 Jan Kowalski PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2300] 05-2012
230 Jan Kowalski PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2300] 06-2012
231 Jadwiga Kowalska PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2300] 05-2012
231 Jadwiga Kowalska PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2300] 06-2012

Nie było by w tym nic złego gdyby nie fakt ze liczba w nawiasie to pole input formularza, które wypełniane jest z zapisanych wyników tylko z poprzedniego miesiąca i jest zmienna wpisywana co miesiąc z programu płacowego.

Siedze nad tym od wczoraj i nie moge nic wymysleć więc może ktoś z was wpadnie na pomysł jak wypisywać złączone dane zależnie od miesiąc (kiedy poprzedni miesiąc ma numer 6 a bieżący 7 to pola są puste ale kiedy już cos wpisaliśmy to przywraca dane z tabeli). Jeśli coś jest niejasne chętnie wyjaśnię.

pmir13
Może napisz jakiś przykładowe dane i spodziewany wynik, bo raczej wątpię by ktoś zrozumiał o co z tymi miesiącami chodzi. Strukturę danych też nietrudno podać, wystarczy wkleić wynik SHOW CREATE TABLE dla wszystkich wykorzystywanych tabel.
seeb
Spodziewane wyniki (order nie ma znaczenia bo jest dodawany na końcu):
...
id imie i nazwisko pesel numer rachunku bankowego kwota miesiac
230 Jan Kowalski PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [ ] 06-2012
231 Jadwiga Kowalska PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2335.89] 06-2012
231 Jadwiga Nowak PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [1580.83] 05-2012


PLXXXXXXXXXXXXXXXXXXXXXXXXXX numer rachunku bankowego


SHOW CREATE:
  1. CREATE TABLE `jobsys_users` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  4. `username` varchar(150) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  5. `email` varchar(100) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  6. `password` varchar(100) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  7. `usertype` varchar(25) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  8. `block` tinyint(4) NOT NULL DEFAULT '0',
  9. `sendEmail` tinyint(4) DEFAULT '0',
  10. `gid` tinyint(3) UNSIGNED NOT NULL DEFAULT '1',
  11. `registerDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  12. `lastvisitDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  13. `activation` varchar(100) COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  14. `params` text COLLATE utf8_polish_ci NOT NULL,
  15. `stanowisko` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  16. PRIMARY KEY (`id`),
  17. KEY `usertype` (`usertype`),
  18. KEY `idx_name` (`name`),
  19. KEY `gid_block` (`gid`,`block`),
  20. KEY `username` (`username`),
  21. KEY `email` (`email`)
  22. ) ENGINE=MyISAM AUTO_INCREMENT=256 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci


  1. CREATE TABLE `jobsys_wyplaty` (
  2. `lp` int(11) NOT NULL AUTO_INCREMENT,
  3. `id` int(11) NOT NULL,
  4. `miesiac`varchar(7) NOT NULL,
  5. `kwota` decimal(9,2) NOT NULL,
  6. `wyk` char(1) COLLATE utf8_polish_ci NOT NULL,
  7. PRIMARY KEY (`lp`)
  8. ) ENGINE=MyISAM AUTO_INCREMENT=144 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci


  1. CREATE TABLE `jobsys_pracownicy` (
  2. `lp` int(11) NOT NULL AUTO_INCREMENT,
  3. `id` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  4. `Kod` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  5. `Archiwalny` varchar(2) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  6. `Drugie_imie` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  7. `Data_urodzenia` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  8. `Miejsce_urodzenia` varchar(70) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  9. `Imie_ojca` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  10. `Imie_matki` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  11. `Nazwisko_rodowe` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  12. `Nazwisko_rodowe_matki` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  13. `Plec` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  14. `nr_iban` varchar(33) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  15. `nazwisko_iban` varchar(40) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  16. `adres_iban` varchar(80) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  17. `status_zus` varchar(4) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT ' ',
  18. `Pesel` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci DEFAULT NULL,
  19. PRIMARY KEY (`lp`),
  20. UNIQUE KEY `Pesel` (`Pesel`)
  21. ) ENGINE=MyISAM AUTO_INCREMENT=189 DEFAULT CHARSET=utf8
pmir13
Ok podałes strukturę tabel i spodziewany wynik, ale wciąż nie ma najważniejszego. Czyli danych na podstawie jakich taki wynik ma powstać. Bo dlaczego Jan Kowalski ma mieć pusto tam gdzie jest kwota a inni nie? Jaka konkretnie informacja w bazie danych ma to powodować?
seeb
pani kadrowa przepisuje z listy płac kwoty jakie maja zostac przelane, sprawdza to księgowa i ostatecznie wlasciciel/dyrektor daje zielone swiatlo do przelewu.
Na każdym etapie musi być możliwość edycji tej kwoty w przypadku pomyłki. Np kwota jest zgodna z wypracowaną godzinówką ale z jakiś powodów szef zdecydował się dać komuś premię motywacyjną albo została pobrana zaliczka w gotówce.

jeśli np z jakiegos powodu w tym miesiącu ktoś nie stawił się do pracy na umowę zlecenie to dane nadal powinny pozostawać w systemie bo może nie stawiał się przez miesiąc ale ma jakies tam 2-3 godziny jednak wypracowane a raport go nie obejmował albo poprostu nie pracował to nie dostanie kasy.
Pracownicy stali tez mimo tych samych godzin wypracowanych nie dostaną identycznych pensji bo zawsze cos wpływa na pensję. A to ktoś ma wiecej lat stazu, lepsze szkolenia, wykształcenie etc.

jak kiedys dopiszę do tego automatykę to dane tam będą się pojawiały automagicznie z systemu ale puki tego nie zrobię będzie reczne wpisywanie kwot.
pmir13
Chyba w ogóle nie przeczytałeś mojego ostatniego postu. Jaka informacja w bazie danych odpowiada za to, co ma się pojawić jako kwota?
seeb
jobsys_wyplaty.kwota wydawało mi się to na tyle oczywiste, że nie napisałem.
pmir13
W takim razie pierwsze zapytanie wyświetla dokładnie to co chcesz i temat można zamknąć.
seeb
Problem w tym, że nie. Wszystko gra gdy w bazie z kwotami jest pusto i gdy jest pierwszy miesiąc jednak gdy są dwa miesiące wyniki się dublują jak w przykładzie z pierwszego postu.

Oczekuję wyniku np:
230 Jan Kowalski PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [ ] 06-2012
231 Jadwiga Kowalska PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2335.89] 06-2012
232 Jadwiga Nowak PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [1580.83] 06-2012

a dostaję w drugim miesiącu coś takiego:

230 Jan Kowalski PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [ 1250] 05-2012
230 Jan Kowalski PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [ ] 06-2012
231 Jadwiga Kowalska PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2432.53] 05-2012
231 Jadwiga Kowalska PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [2335.89] 06-2012
232 Jadwiga Nowak PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [1648.22] 05-2012
232 Jadwiga Nowak PESEL PLXXXXXXXXXXXXXXXXXXXXXXXXXX [1580.83] 06-2012

czyli zamiast w lipcu dostac wyniki tylko z czerwca dostaję też z maja gdybyśmy mówili też o kwietniu to otrzymalibyśmy jeszcze jeden wiersz dla każdego zatrudnionego
i tu jest problem! Zawarłem to w pierwszym poście ale tu przypominam czego dotyczy problem.
mmmmmmm
  1. SELECT u.id, u.name AS imie_i_nazwisko, p.nr_iban, w.kwota, w.miesiac
  2. FROM xxx_users AS u
  3. LEFT JOIN xxx_pracownicy AS p ON u.id = p.id
  4. LEFT JOIN xxx_wyplaty AS w ON p.id = w.id
  5. JOIN (SELECT id, MAX(miesiac) miesiac FROM xxx_wyplaty GROUP BY id) x ON x.id=w.id AND x.miesiac=w.miesiac
  6. WHERE p.id >0
  7. AND p.Archiwalny = 'N' AND p.grupa='P'
  8. ORDER BY imie_i_nazwisko
pmir13
Czyli po prostu potrzebujesz ograniczyć wyniki do poprzedniego miesiąca?

W takim razie wystarczy dodać do WHERE nowy warunek:
  1. AND w.miesiac = date_format(now()-interval 1 month, '%Y-%m')
seeb
Tak w jednym tak w drugim przypadku coś nie gra. Pierwszy o ile dostałem wyniki wprawdzie rozbierzne od oczekiwanych ale ze spodziewanych 150 otrzymałem 132 o tyle w drugim przypadku zero wyników.

Potrzebuję listę wszystkich pracowników dla nowego miesiąca wynikającą ze złączenia users i pracownicy bez względu na to czy mieli czy nie wypłaty kiedykolwiek. Jednak jeśli już podaliśmy dane za miesiąc poprzedni powinny być pobrane. Może w ten sposób łatwiej nam będzie się skomunikować.

W każdym razie dziekuję za już okazane zainteresowanie i liczę na jeszcze.

mmmmmmm w twoim rozwiązaniu brakuje nowych pracowników (którzy nie pracowali w maju a co za tym idzie w czerwcu nie otrzymywali wynagrodzenia)

Rozwiązanie mojego problemu:
  1. SELECT u.id, u.name AS imie_i_nazwisko, p.pesel, p.nr_iban, w.kwota, w.miesiac
  2. FROM jobsys_users AS u
  3. LEFT JOIN jobsys_pracownicy AS p ON u.id = p.id
  4. LEFT JOIN jobsys_wyplaty AS w ON p.id = w.id
  5. AND w.miesiac = date_format(now()-interval 1 month, '%m-%Y')
  6. WHERE p.id > 0
  7. AND p.Archiwalny = 'N' AND p.grupa='P'
  8. ORDER BY imie_i_nazwisko


Istotą było gdzie wstawić ów interwał.
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.