Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Policzenie braków
Forum PHP.pl > Forum > Bazy danych > MySQL
markonix
Dość prosty problem.

Dwie tabele:

Pierwsza tabela trening, data + numer treningu w danym dniu.
Druga tabela to obecność, data + numer treningu (i kolejne obecności osócool.gif.

Teraz jak fajnie sprawdzić ile mam takich treningów dla których obecność nie została sprawdzona.
Koncepcyjnie to wygląda tak, że jak mamy datę i dany numer treningu, i nie ma ani jednego (nie interesuje nas ile ich jest) analogicznego wiersza w tabeli obecności to mamy jeden brak.

Próbuje z JOINami ale na razie wychodzą mi straszne potworki. W samym PHP było by to banalne do zrobienia ale dość często to będzie wykonywane dlatego chciałbym optymalnie to napisać.
johny_s
  1. SELECT count(*)
  2. FROM trening t
  3. LEFT JOIN obecnosc o ON o.nr_tr = t.nr_tr
  4. WHERE o.DATA IS NULL
markonix
Dzięki, mniej więcej o to chodzi ale to by było za proste.
Bez grupowania dubluje treningi.

Na razie mam coś takiego:
  1. SELECT * FROM `training_schedule` LEFT JOIN `presence` ON (
  2. `training_schedule`.`date` = `presence`.`date` AND
  3. `training_schedule`.`training_no` = `presence`.`training_no` AND
  4. `training_schedule`.`team_id` = `presence`.`team_id`
  5. ) WHERE `training_schedule`.`team_id` = 1 AND `presence`.`id` IS NULL
  6. GROUP BY
  7. `training_schedule`.`date`, `training_schedule`.`training_no`
  8. ORDER BY `training_schedule`.`date` DESC

Ale troszkę przymula, a rekordów jeszcze dużo nie ma :/

(bez COUNT bo jednak muszę też pobrać, policzę już w PHP).
Pyton_000
Musisz mieć klucze na polach dla których robisz łączenia
Generalnie powinno wystarczyć łączenie po dacie i nr. treningu
mmmmmmm
Tylko jedna mała uwaga. Najlepiej, abyś we WHERE ... IS NULL podawał pole po którym łączysz. Może się zdarzyć, że podasz tam pole NOT NULL i wynik wcale nie będzie prawdziwy. Gdy podasz pole, po którym łączysz nie ma szans by się coś takiego przydarzyło...
markonix
No raczej mało możliwe aby ID (Auto increment) było NULL smile.gif
Ale uwaga słuszna.

Co do indeksów - wystarczył indeks podwójny na dacie i numer treningu w tabeli obecności (indeks w tabeli treningów już nic nie zmieniał).
Dzięki.

edit: Jeżeli mówiłeś o tym łączeniu w kontekście że w JOINie nie jest potrzebne " `training_schedule`.`team_id` = `presence`.`team_id`" to nie masz racji - wtedy połączy obecności z danego dnia i treningu z obecnościami innej drużyny (numer treningu to nie id a tylko określenie który trening w dniu).
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.