Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rogerblower

Cláusula WHERE não retorna dados

Recommended Posts

Boas pessoal estou ficando de cabelo em pé, preciso extrair os dados da tabela usando a cláusula

classe = 'A', mas quando incluo ela na consulta não retorna nada, quando excluo retorna todos os dados da cláusula etapa_id = '1

 

Onde estou errando?

SELECT chevy.*, pontos.*, SUM(pts) as soma FROM chevy
                INNER JOIN pontos ON chevy.pos = pontos.posicao WHERE classe = 'A' AND etapa_id = '1'
                GROUP BY chevy.nome
                ORDER BY pos ASC

A tabela esta assim

CREATE TABLE IF NOT EXISTS `chevy` (
  `id` int(11) NOT NULL,
  `pos` varchar(10) CHARACTER SET utf8mb4 NOT NULL,
  `etapa_id` int(11) NOT NULL,
  `No` varchar(10) CHARACTER SET utf8mb4 NOT NULL,
  `nome` varchar(255) CHARACTER SET utf8mb4 NOT NULL,
  `classe` varchar(100) CHARACTER SET utf8mb4 NOT NULL,
  `voltas` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `tempo_total` time NOT NULL,
  `diff` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `espaco` varchar(20) CHARACTER SET utf8mb4 NOT NULL,
  `media` varchar(20) CHARACTER SET utf8mb4 NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=67 DEFAULT CHARSET=utf8;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se quando você filtra os dois campos não retorna nada, é porque não existe nenhuma classe = 'A' com etapa_id = '1'.

 

Pensa comigo:

  • Se eu quero classe A que está na etapa 1, eu uso AND: WHERE classe = 'A' AND etapa_id = 1;
  • Se eu quero todos da classe A e todos da etapa 1, neste caso, uso OR: WHERE claase = 'A' OR etapa_id = 1.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então lokao eu preciso dos nomes que fazem parte da classe A e estavam presente na etapa 1

Não seria

WHERE classe = 'A' AND etapa_id = '1'?

Quando usei

WHERE classe = 'A' OR etapa_id = '1'

Me retorna todos da etapa_id 1, e todas as classes, classe A e classe B, mas preciso somente da classe A

Compartilhar este post


Link para o post
Compartilhar em outros sites

negativo, já fiz vários testes, incluindo dados da A quanto da B e para etapa 1 e outras também.

tudo funciona basta colocar a cláusula classe = 'A' na consulta que para de mostrar dados.

 

Fiz um teste ainda pouco que funcionou, criei uma coluna categoria campo tinyint e setei como categorias 1 e 2 e assim funciona, o problema esta mesmo na classe, seria classe uma palavra reservada do mysql?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos fazer uma contagem agrupada:

SELECT classe, etapa_id, COUNT(*) AS quantidade
FROM chevy
GROUP BY classe ASC, etapaa_id ASC

Esta SQL vai agrupar as classes com as etapas existentes, se não existir, não será exibido.

 

Insisto que não existe etapa 1 para a classe A, se existir, esta SQL vai dizer quantos são na coluna quantidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui lokaodomau vou deixar registrado aqui, pois estou desde ontem a noite perdendo cabelos com essa consulta:

 

Então, os dados da tabela vem de um arquivo.csv que faço o upload e gravo na tabela,

só que no csv a classe esta com espaços e estes espaços são gravados no banco ficando assim]

 

classe = ' A ' copiei a classe o banco e colei na consulta e funcionou.

 

Aprendi mais uma, o espaço no banco tem seu valor :rolleyes:

 

Agora vou atrás de como eliminar os espaços do csv antes de gravar no banco

 

Obrigado lokaodomau pela força aí

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom! Use a função TRIM().

 

Exemplo:

mysql> SELECT TRIM('  bar   ');
        -> 'bar'
mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
        -> 'barxxx'
mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
        -> 'bar'
mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
        -> 'barx'

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.