Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá!
Preciso filtrar valores diferentes que estão em uma mesma COLUNA dentro de uma TABELA. Estou tentando fazer um SELECT e não consigo filtrar corretamente. Saca só!
TABELA orcamento
COLUNA empresa
COLUNA cidade_equipamento
empresa | cidade_equipamento
A | BRASILIA
A | Caçamba
A | Empilhadeira
B | CURITIBA
B | Caçamba
$cidade = BRASILIA
$equipamento = Caçamba,Empilhadeira
Obs: preciso pegar a empresa que seja de BRASILIA e que tenha ou Caçamba ou Empilhadeira. Mas precisa ser de BRASILIA.
Fiz assim:
"SELECT * FROM orcamento WHERE cidade_equipamento = $cidade OR cidade_equipamento in ($equipamento) GROUP BY empresa"
Com esse select a empresa (B) tá retornando (por conta do equipamento Caçamba) e eu gostaria que só retornasse a empresa (A) que é de BRASÍLIA.
Eu também tentei usar o AND ao invés do OR e retornou vazio:
...WHERE cidade_equipamento = $cidade **AND** cidade_equipamento in ($equipamento) GROUP BY empresa"
=/if( cidade_equipamento in ($equipamento), cidade_equipamento , null)) as CampoX,
count(if( cidade_equipamento in ($equipamento), cidade_equipamento, null)) as totalCampoX,
Onde que entram as cidades? Você entendeu que as Cidades e os Equipamentos estão na mesma coluna?
Entendi!
Por isso mesmo que sugestiono você alterar o esquema dessa sua tabela
EMPRESA | CIDADE | UF | EQUIPAMENTO
Concordo plenamente com o amigo, mas infelizmente não será possível alterar a tabela, não tenho essa permissão do cliente. Preciso fazer funcionar com esse formato.
=/
O que você vai poder fazer é no esquema que te mostrei dos IFs fazer algo do tipo
if( cidade_equipamento in ($equipamento), cidade_equipamento , null)) as equipamento, count(if( cidade_equipamento in ($equipamento), cidade_equipamento, null)) as totalEquipamento,
if( cidade_equipamento in ($cidade), cidade_equipamento , null)) as cidade, count(if( cidade_equipamento in ($cidade), cidade_equipamento, null)) as totalCidade,
Dessa forma você consegue dar um while separando a cidade em cidade e equipamento em equipamento.
E na apresentação dos dados, tratar com ifs do php os dados que vierem vazios/null
Como as informações estão tudo numa unica linha e tais informações devem ser categorizadas - de acordo com a solicitação do seu cliente - você vai ter que fazer uma "gambiarra".
Sem a separação por colunas, você vai trabalhar no modo gambiarra.
Seria interessante explicar isso ao seu cliente e sugerir a mudança porque deste jeito a longo prazo ficará praticamente impossivel categorizar e agrupar dados.
Conteudo migrado sem texto.
Um modelo ruim torna uma sql simples em algo complicado de forma desnecessária , altere o modelo.
Gato Mia...
Ponto 1 - Vai ser necessario um tratamento no PHP, como colocar aspas
Ponto 2 - Seu codigo pode ficar vulneravel a SQL Inject
Ponto 3 - Como disse o Motta é melhor refazer esse modelo tem dois campos distintos no mesmo campo misturados.
select c.empresa
from orcamento c , orcamento e
where
c.cidade_equipamento = $cidade
and e.cidade_equipamento in ($equipamento)
and c.empresa = e.empresa
Um exemplo de como fazer IF's direto no select
if( NomeColuna=sabao, NomeColuna, null) as produto1
count(if( NomeColuna=sabao, NomeColuna, null)) as totalProduto1,
Para buscar mais de um registro
if( NomeColuna in (sabao,amaciante,detergente), NomeColuna , null)) as produtoLimpeza,
count(if( NomeColuna in (sabao,amaciante,detergente), NomeColuna, null)) as totalProdutoLimpeza,
Mas no seu caso acredito que se aplica mais um GROUP BY
Mas pelo seu esquema de tabela, eu recomendaria você ter mais uma coluna ficando
EMPRESA | CIDADE | UF | EQUIPAMENTO
Assim acredito que seria o mais coerente de se ter para poder agrupar os dados da melhor forma