Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Inne wyniki po dodaniu warunku WHERE, ... który nic nie powinien zmienić
Zdziho
post 3.04.2016, 22:23:30
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 3.04.2016

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


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
Go to the top of the page
+Quote Post
maly_swd
post 4.04.2016, 09:04:27
Post #2





Grupa: Zarejestrowani
Postów: 744
Pomógł: 118
Dołączył: 14.02.2009
Skąd: poziome

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


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


--------------------
śmieszne obrazki
Kryzys: Ser jem spleśniały, wino piję stare i samochód mam bez dachu..
Go to the top of the page
+Quote Post
Zdziho
post 4.04.2016, 10:35:53
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 3.04.2016

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


Działa, dzięki. smile.gif
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 Wersja Lo-Fi Aktualny czas: 10.06.2024 - 08:51