Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Inne wyniki po dodaniu warunku WHERE
Forum PHP.pl > Forum > Bazy danych > MySQL
Zdziho
Witam,
bardzo proszę o pomoc w zrozumieniu dlaczego dostaje dwa różne wyniki gdy do zapytania dodaje warunek WHERE.
Otóż:
1) Gdy zapytanie jest w takiej formie:
  1. SELECT Players.id_player, SUM(Matches.pkt_player1) AS TOTAL
  2. FROM Players
  3. LEFT JOIN Matches
  4. ON Players.id_player = Matches.id_player1
  5. WHERE Players.Groups_id_group=4
  6. GROUP BY Players.id_player
  7. ORDER BY TOTAL DESC

Dostaje w wyniku 6 wierszy (czyli prawidłowo - tego właśnie oczekuje smile.gif)

CODE
+----+------+
| id | Tot |
+----+------+
| 1 | 8 |
+----+------+
| 2 | 4 |
+----+------+
| 3 | 2 |
+----+------+
| 4 | NULL |
+----+------+
| 5 | NULL |
+----+------+
| 6 | NULL |
+----+------+


2) Do tego zapytania dodaje Where Matches.date BETWEEN '2016-04-01' and '2016-04-15' i dostaje inny wynik.
Zapytanie wtedy ma forme:
  1. SELECT Players.id_player, SUM(Matches.pkt_player1) AS TOTAL
  2. FROM Players
  3. LEFT JOIN Matches
  4. ON Players.id_player = Matches.id_player1
  5. WHERE Players.Groups_id_group=4 AND matches.date BETWEEN '2016-04-01' AND '2016-04-15'
  6. GROUP BY Players.id_player
  7. ORDER BY TOTAL DESC


i w wyniku dostaje 3 wiersze:
CODE
+----+------+
| id | Tot |
+----+------+
| 1 | 8 |
+----+------+
| 2 | 4 |
+----+------+
| 3 | 2 |



Gdzie sie podziały "moje" NULL'e? Dodam, że w tabeli Matches są aktualnie tylko rekordy z datą between '2016-04-01' and '2016-04-15'. Wiec na moj amatorski rozum wyniki powinny byc identyczne.
Bardzo mi zależy na tym, żeby dostać jednak te dodatkowe rekordy z wartościami NULL.
Pomożecie? smile.gif
maly_swd
Ponieważ matches.date BETWEEN '2016-04-01' AND '2016-04-15' działa na wynik z LEFT JOINA gdzie są pewnie nulle, więc te nule nie spełniają warunku.

Jak chcesz aby było to filtrowane poprawnie to:
  1. SELECT Players.id_player, SUM(Matches.pkt_player1) AS TOTAL
  2. FROM Players
  3. LEFT JOIN Matches
  4. ON Players.id_player = Matches.id_player1 AND matches.date BETWEEN '2016-04-01' AND '2016-04-15'
  5. WHERE Players.Groups_id_group=4
  6. GROUP BY Players.id_player
  7. ORDER BY TOTAL DESC
Zdziho
Działa, dzięki. smile.gif
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.