Eu tenho uma consulta MySQL:
SELECT
p.informationProvider as pGLN,
p.productID,
p.productStatus
FROM tblproducts AS p
WHERE
-- informationProvider is of type varchar(14)
p.informationProvider = '8718885110005'
Resultado disso é:
pGLN productID productStatus
8718885110005 497905 closed
8718885110005 497906 closed
8718885110005 497907 closed
8718885110005 497908 closed
8718885110005 505972 closed
8718885110005 505973 closed
8718885110005 508261 received
8718885110005 508262 received
8718885110005 508263 received
8718885110005 513591 received
8718885110005 517529 received
8718885110005 537381 received
Agora tenho outra consulta:
SELECT
c.informationProvider as cGLN,
c.companyName
FROM tblcompanies as c
WHERE
-- informationProvider is of type varchar(14)
c.informationProvider = 8718885110005
O Resultado disso é:
cGLN companyName
8718885110005 Oliva BV
Agora vou combinar essas duas consultas.
SELECT
c.informationProvider as cGLN,
p.informationProvider as pGLN,
COUNT(p.productID) AS count,
p.productID,
p.productStatus
FROM tblproducts AS p
INNER JOIN tblcompanies AS c ON (c.informationProvider = p.informationProvider)
WHERE p.productStatus IN ('requested' , 'expected', 'open') -- closed and received aren't in the list
AND c.informationProvider = '8718885110005'
O resultado:
cGLN pGLN count productID productStatus
8718885110005 NULL 0 NULL NULL
-------- o problema ------
Ok, agora vou mudar um pouco. vou mudar AND c.informationProvider = '8718885110005'
para AND c.informationProvider = 8718885110005
. Assim, a string será apresentada como um inteiro.
O resultado disso é:
cGLN pGLN count productID productStatus
NULL NULL 0 NULL NULL
Isso me surpreendeu, por que a célula cGLN tem um NULL?
Minha primeira ideia foi verificar se o valor da string é igual ao inteiro. Para minha surpresa foram.
SELECT 8718885110005 = '8718885110005'; -- this is 1
Isso me surpreendeu ainda mais.
Minha pergunta: Por que o cGLN é NULL?
Os comentaristas foram muito úteis. Eles me empurraram para pensar na direção certa. Deixe-me explicar.
Se você tivesse uma tabela assim:
E, você executaria uma consulta como esta:
O resultado seria
3
.Se você executar uma consulta como abaixo:
Então você veria apenas 1 status, outras células de status desapareceriam. Este desaparecimento pode significar problemas.
Uma consulta correta deve ter esta aparência:
ONLY_FULL_GROUP_BY
MySQL pode funcionar em diferentes modos. Um desses modos é chamado:
ONLY_FULL_GROUP_BY
. Este modo está desativado em alguns Servidores de Banco de Dados. Este modo força os administradores de banco de dados a usar oGROUP BY
em uma consulta agregada ( consulta com umCOUNT()
).Link: https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_only_full_group_by
@danblack estava pensando na direção certa. A consulta deve ficar assim:
Nesse último caso, ele precisa converter cada valor de varchar em um número antes de verificar. Os primeiros 3 casos podem usar um índice na coluna.