Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak zoptymalizować zapytanie? 2tabele, 2warunki, 3kolumny
Forum PHP.pl > Forum > Bazy danych > MySQL
bulimaxiu
Witam.

Proszę o radę dot. zapytania.

Mamy tabelę_1 z wykazem spotkań i tabelę_2 z wykazem obecności userów ('1' - tak, '2'-nie)
Chcę jednym zapytaniem otrzymać datę spotkania, ilość obecnych i ilość nieobecnych.

Działa prawidłowo zapytanie
  1. SELECT DISTINCT `date`,
  2. (SELECT COUNT(`decision`) FROM `user_has_attempt` WHERE `user_has_attempt`.`decision` = 0 AND `attempts`.`id` = `user_has_attempt`.`attempt_id`) AS 'nie',
  3. (SELECT COUNT(`decision`) FROM `user_has_attempt` WHERE `user_has_attempt`.`decision` = 1 AND `attempts`.`id` = `user_has_attempt`.`attempt_id`) AS 'tak'
  4. FROM `attempts`, `user_has_attempt`

tyle że nie wygląda mi zbyt optymalnie. Próbowałem zrobić
  1. SELECT `date`, COUNT(A1.`decision`) AS 'nie', COUNT(A2.`decision`) AS 'tak' FROM `attempts`
  2. JOIN `user_has_attempt` AS A1 ON `attempts`.`id` = A1.`attempt_id` AND A1.`decision` = 0
  3. JOIN `user_has_attempt` AS A2 ON `attempts`.`id` = A2.`attempt_id` AND A2.`decision` = 1

ale nie działa prawidłowo. Powyższe działa tylko pojedynczo
  1. SELECT `date`, COUNT(A1.`decision`) AS 'tak' FROM `attempts`
  2. JOIN `user_has_attempt` AS A1 ON `attempts`.`id` = A1.`attempt_id` AND A1.`decision` = 0

Działa też mix:
  1. SELECT `date`, COUNT(A1.`decision`) AS 'nie', (SELECT COUNT(`decision`) FROM `user_has_attempt` WHERE `decision` = 1) AS 'tak' FROM `attempts`
  2. JOIN `user_has_attempt` AS A1 ON `attempts`.`id` = A1.`attempt_id` AND A1.`decision` = 0


Czy można ładniej napisać to działające zapytanie?

Pozdrawiam.
erix
Cytat
tyle że nie wygląda mi zbyt optymalnie. Próbowałem zrobić

Nie patrz z wyglądu, bo to jakbyś oceniał piwo po etykiecie.

Sprawdź explainem.
bulimaxiu
A czy tak to powinno być zrobione, czy jest lepszy sposób na taką operację? (np. pod względem prędkości wykonania)
erix
IMO nic lepiej tu nie wyciągniesz, chyba że zrezygnujesz z normalizacji.
bulimaxiu
Rozumiem, dziękuję EOT.
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.