Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia galera.
Preciso listar 2 tabelas(produtos x itens) no mysql.
PRODUTOS
id_produto int(10)
id_linha_produtos int(10)
ativo tinyint(3)
ITENS
id_item int(10)
id_produto int(10)
entaum fiz assim :
SELECT * FROM produtos inner JOIN itens ON produtos.id_produto = itens.id_produto WHERE produtos.ativo = 1
tenho apenas um registro na tabela de produtos, que está desativado, ou seja, o campo ativo tem o valor 0(ZERO), os demais tem valor 1(UM)
mas a condição do select é ignorada, ele traz todos os registros ativos e o não ativo. e se eu inverter a busca para procurar os não ativos, num trás nada.
ALGUÉM AI PODE ME DIZER ONDE ESTOU VIAJANDO?
pois é meu banco de dados lazarento que num quer de jeito nenhum funcionar direito, mas somente com um registro! qq outro q eu altere o flag de ativado ou naum, ele funciona, ou seja, lista ou naum o registro, mas para este registro em especifico, por mais que eu altere e no banco me apresente o valor "correto", ele sempre lista o registro, estando com valor para ser mostrado ou naum.
ainda num consegui resolver o problema, pois num posso excluir o registro, pois trocentos outros dependem dele...
ja alterei o registro de várias formas, pelo asp, pelo phpmyadmin...
de qq forma, seu q agora o erro num está no select, entaum alguém sabe o q posso fazer para resolver esse negócio?
>
Não conheço MySql mas não pode ser este type tinyint?
até pensando no que disse, mudei o campo para varchar para ver se mudava alguma coisa mas por incrível q pareça nada mudou..
vou procurar mais um pouco, se num encontrar meio de "normalizar" o registro, vou remover o mesmo e todos seus dependentes e recadastrá-los, por mais idiota que possa parecer.
obrigado mesmo assim
onde você está executando esta SQL? do php???
se tem acesso ao console do mysql, tente rodar esta query la e ver o resultado...
Outra coisa, use aliases para os nomes de tabelas..
De
>
SELECT * FROM produtos inner JOIN itens ON produtos.id_produto = itens.id_produto WHERE produtos.ativo = 1
Para isto
SELECT p.* FROM produtos p INNER JOIN itens i ON p.id_produto = i.id_produto WHERE p.ativo = 1
Outra observação, se você utiliza apenas 0 e 1 na coluna ativo, a coluna deveria ser tinyint(1) = isso te daria de 0 - 9, ou seja você teria bastante espaço para por exemplo
0 - ativo
1 - inativo
2 - cancelado
3 - aguardando confirmação
e assim por diante, mas se planeja ter mais de 10 variações, dai tem que aumentar o tamenho do field mesmo.
é q eu migrei este banco de dados do access e era boolean, ai ele gera esse campo tinyint automaticamente com 3 e eu nem tinha percebido.
uso asp, o select com aliases está implementado, vlw
verificando com mais calma, percebi que vários registros são mostrados mesmo com o campo ativo = 0, eu pensei q fosse um só, mas naum é, tem mais, embora com outros registros funcione...
Num to entendendo mais nada!
A query completa tem mais condições.
Já tentei com a query das seguintes formas:
SELECT p.*, s.* FROM produtos AS p inner JOIN itens AS s ON s.id_produto = p.id_produto and p.ativo = 1 where p.id_linha_produtos = 4 and s.id_veiculo = 174
SELECT p.*, s.* FROM produtos AS p inner JOIN itens AS s ON s.id_produto = p.id_produto where p.ativo = 1 and p.id_linha_produtos = 4 and s.id_veiculo = 174
das duas formas ele mostra exatamente a mesma coisa.
na url abaixo poderá ver o retorno, a lista que está retornando no momento não reveria retornar nada, todos tem o valor 0(zero) no campo ativo.
http://gustavorosa.com.br/catalogo/lista_itens.asp?id_linha_produtos=4&id_veiculo=174
Este relacionamento de produtos e itens, é de um para muitos, um produto tem vários itens, e o campo ativo está na tabela produtos.
Mas num sei se isso tem a ver, por que o outro campo da tabela produtos id_linha_produtos, no select a condição é respeitada..
vlw
>
A query completa tem mais condições.
Já tentei com a query das seguintes formas:
SELECT p.*, s.* FROM produtos AS p inner JOIN itens AS s ON s.id_produto = p.id_produto and p.ativo = 1 where p.id_linha_produtos = 4 and s.id_veiculo = 174
SELECT p.*, s.* FROM produtos AS p inner JOIN itens AS s ON s.id_produto = p.id_produto where p.ativo = 1 and p.id_linha_produtos = 4 and s.id_veiculo = 174
das duas formas ele mostra exatamente a mesma coisa.
na url abaixo poderá ver o retorno, a lista que está retornando no momento não reveria retornar nada, todos tem o valor 0(zero) no campo ativo.
http://gustavorosa.com.br/catalogo/lista_itens.asp?id_linha_produtos=4&id_veiculo=174
Este relacionamento de produtos e itens, é de um para muitos, um produto tem vários itens, e o campo ativo está na tabela produtos.
Mas num sei se isso tem a ver, por que o outro campo da tabela produtos id_linha_produtos, no select a condição é respeitada..
vlw
No campo ativo use small int com valor default 1, caso dê errado tire a expressão inner join e use apenas Join.
Esse problema pode ser na conversão dos dados do Access para o Mysql.
Uma sugestão caso dê errado os ítens acima, utilize casting:
SELECT *,CAST(produtos.ativo AS smallint(1)) as ColunaAtivo
FROM produtos AS p inner JOIN itens AS s ON s.id_produto = p.id_produto where ColunaAtivo = 1
Não conheço MySql mas não pode ser este type tinyint?