AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 219973
Accepted
Julian
Julian
Asked: 2018-10-13 07:06:37 +0800 CST2018-10-13 07:06:37 +0800 CST 2018-10-13 07:06:37 +0800 CST

SELECT icw a COUNT e INNER JOIN fornecem resultados diferentes com literais de string e valores numéricos quando são usados ​​em uma cláusula WHERE

  • 772

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?

mysql count
  • 2 2 respostas
  • 633 Views

2 respostas

  • Voted
  1. Best Answer
    Julian
    2018-10-16T00:04:52+08:002018-10-16T00:04:52+08:00

    Os comentaristas foram muito úteis. Eles me empurraram para pensar na direção certa. Deixe-me explicar.

    Se você tivesse uma tabela assim:

    gln     status
    108     closed
    108     open
    108     closed
    

    E, você executaria uma consulta como esta:

    SELECT COUNT(gln) FROM tableA
    

    O resultado seria 3.

    Se você executar uma consulta como abaixo:

    SELECT COUNT(gln), status FROM tableA
    

    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:

    SELECT COUNT(gln), status FROM tableA GROUP BY status
    

    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 um COUNT()).

    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:

    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')
    AND c.informationProvider = '8718885110005'
    GROUP BY p.productID, p.productStatus, p.informationProvider
    
    • 2
  2. Rick James
    2018-10-19T18:35:24+08:002018-10-19T18:35:24+08:00
    INT = number    -- good
    INT = 'number'  -- OK
    VARCHAR = 'string'  -- good
    VARCHAR = number    -- BAD
    

    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.

    • 0

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve