Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Policzenie braków
markonix
post
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


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ć.


--------------------
Go to the top of the page
+Quote Post
johny_s
post
Post #2





Grupa: Zarejestrowani
Postów: 594
Pomógł: 122
Dołączył: 17.07.2005
Skąd: P-na

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


  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
Go to the top of the page
+Quote Post
markonix
post
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


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).


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Musisz mieć klucze na polach dla których robisz łączenia
Generalnie powinno wystarczyć łączenie po dacie i nr. treningu
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #5





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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...
Go to the top of the page
+Quote Post
markonix
post
Post #6





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


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).

Ten post edytował markonix 8.05.2014, 19:25:52


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 14:00