6
respostas

Como fazer SELECT com ENUM em tabelas relacionais

Boa tarde,

Estou tentando fazer um Select filtrando os dados de três tabelas diferentes por valor de Enum de uma tabela, mas o filtro não funciona. Por exemplo, há três valores de Enum: 'aberto', 'fechado' e 'cancelado'. Quanto peço Select só para os pedidos de status 'aberto' retorna também os de status 'fechado'. Como faço para filtrar por Enum? Seguem abaixo as tabelas que estão relacionadas:

+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id_prod       | int(11)      | NO   | PRI | NULL    | auto_increment |
| nome          | varchar(255) | YES  |     | NULL    |                |
| quantidade    | int(11)      | YES  |     | NULL    |                |
| valor         | double(9,2)  | YES  |     | NULL    |                |
| categoria_id  | int(11)      | YES  | MUL | NULL    |                |
| fornecedor_id | int(11)      | YES  | MUL | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+


+-----------+--------------------------------------+------+-----+-------------------+----------------+
| Field     | Type                                 | Null | Key | Default           | Extra          |
+-----------+--------------------------------------+------+-----+-------------------+----------------+
| id_pedido | int(11)                              | NO   | PRI | NULL              | auto_increment |
| cli_id    | int(11)                              | YES  | MUL | NULL              |                |
| status    | enum('aberto','fechado','cancelado') | NO   |     | NULL              |                |
| data      | timestamp                            | NO   |     | CURRENT_TIMESTAMP |                |
+-----------+--------------------------------------+------+-----+-------------------+----------------+


+------------+---------+------+-----+---------+-------+
| Field      | Type    | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| pedido_id  | int(11) | YES  | MUL | NULL    |       |
| produto_id | int(11) | YES  | MUL | NULL    |       |
| quantidade | int(11) | YES  |     | NULL    |       |
+------------+---------+------+-----+---------+-------+
6 respostas

Anderson, boa tarde!

Você pode tentar algo assim:

`SELECT status FROM nomeDaTabela WHERE status LIKE '%aberto%'

O uso do % é para dizer que tem coisa antes disso ou depois dependendo do lugar onde você coloca, nesse caso como eu coloquei antes e depois ele vai procurar tudo nessa tabela no campo status que tenha o texto "aberto" no meio dele

Isso irá retornar o que você deseja

Espero ter ajudado e bons estudos!

Seria interessante ver como você tentou fazer.

Olhando a sua estrutura, não identifiquei os nomes das tabelas. Aqui tem um exemplo com base no nomes dos campos

select P.id_pedido, P.cli_id,  P.status, P.data, 
P2.produto_id, P2.quantidade  
from pedidos as P
INNER JOIN pedidos_itens as P2 
ON P.id_pedido = P2.pedido_id
WHERE P.status = 'aberto'

Boa tarde, Felipe,

Com ou sem % retorna apenas os pedidos fechados. Estranho.

Daniel,

Este é o Select que tentei fazer e não deu certo:

SELECT it.pedido_id, it.quantidade, pdt.nome as produto_nome FROM tb_itens_pedidos it 
INNER JOIN tb_produtos pdt ON pdt.id_prod = it.produto_id
INNER JOIN tb_pedidos WHERE tb_pedidos.status = 'aberto' GROUP BY it.produto_id ORDER BY it.pedido_id

Retorna todos os dados da tabela tb_itens_pedidos, ou seja, todas as linhas, exceto o pedido que está relacionado com a tabela tb_pedidos onde o status está como 'aberto'. O contrário do que eu preciso. Esse relacionamento é entre três tabelas: Itens pedidos = tb_itens_pedidos Produtos = tb_produtos Pedidos = tb_pedidos

Testei também os seguintes selects, mas são ignorados e retornam todos os pedidos com status 'fechado':

SELECT it.pedido_id, it.quantidade, pdt.nome as produto_nome FROM tb_itens_pedidos it 
INNER JOIN tb_produtos pdt ON pdt.id_prod = it.produto_id
INNER JOIN tb_pedidos WHERE tb_pedidos.status <> 'fechado' GROUP BY it.produto_id ORDER BY it.pedido_id

SELECT it.pedido_id, it.quantidade, pdt.nome as produto_nome FROM tb_itens_pedidos it 
INNER JOIN tb_produtos pdt ON pdt.id_prod = it.produto_id
INNER JOIN tb_pedidos WHERE tb_pedidos.status != 'fechado' GROUP BY it.produto_id ORDER BY it.pedido_id

Daniel, bom dia!

Você pode selecionar usando o indice daquele ENUM na sua tabela, ou seja, ao invés de colocar o valor dentro da tabela referencie o indice dele, como nesse caso, o valor "aberto" é o primeiro dentro da lista, no WHERE assim:



SELECT it.pedido_id, it.quantidade, pdt.nome as produto_nome FROM tb_itens_pedidos it 
INNER JOIN tb_produtos pdt ON pdt.id_prod = it.produto_id
INNER JOIN tb_pedidos WHERE tb_pedidos.status = 1 GROUP BY it.produto_id ORDER BY it.pedido_id

Espero ter ajudado e bons estudos!

Felipe,

Já havia testado esse Select, também não funciona. Retorna todos os pedidos com status 'fechado' e não os como 'aberto', que é o que preciso.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software