0

Query complicada de mysql

criado por Thamer Mazzuca Martins em 10/09/2010 4:12am
Bem galera, eu tenho poco conhecimento em mysql e espero que alguem possa me ajudar por favor, necessito mt.

Vamos deixar explicado.

Tenho 2 tabelas.

Primeira tabela se chama usuarios e nela eu tenho o campo id [int 20 auto] e campo nome [varchar 50]
Segunda tabela se chama pedidos com id [int 20 auto], id_usuario [int 20], comproucredito [int 1]

OBS:
comproucredito = vai estar 0 se o usuario comprou credito ou 1 se ele nao comprou.
id_usuario = é o id que esta na tabela usuario

Bem, oque eu quero:
Queria fazer uma listagem da tabela usuarios mas, somente listar os usuarios que nao tenham nenhum comproucredito com 1;

OBS: 2 nesta tabela pedidos, pode existir varios pedidos com "ids" diferentes mas do mesmo usuario, ele pode ter feito tanto compra de credio como nao, se ele tiver uma ou mais compra de credito, ele nao entra na lista que eu quero.

Espero no fundo do caracao que alguem consiga me ensinar como fazer esse filtro, obrigado

Lista de Respostas:

0
Resposta Final (Undo)
10/09/2010 9:49pm
(~7 anos atrás)
Sousa VArela respondeu:
Oi!
Podes resolver isso primeiro tens que relacionar as tabelas de tal forma:
1 usuario FAZ varios pedidos
1 pedidos É Feito por varios usuarios
Aqui eles têm um relacionamento Muitos para Muitos que resulta de uma terceira tabela com as chaves primeiras das duas com chave primaria da terceira e algum atributo de relacionamento. Esta é a tua query:
SELECT usuarios.id_usuario,
usuarios.id_patrocinador,
usuarios.nome,
usuarios.sexo,
usuarios.cpf,
usuarios.senha,
usuarios.nascimento,
usuarios.endereco,
usuarios.ponto_de_referencia,
usuarios.cep,
usuarios.bairro,
usuarios.cidade,
usuarios.telefone_1,
usuarios.telefone_2,
usuarios.email,
usuarios.estado,
usuarios.data_de_criacao,
usuarios.numero,
usuarios.emails_da_empresa,
usuarios.rg,
usuarios.emails_do_upline,
usuarios.nome_na_foto,
usuarios.nome_escolhido,
usuarios.valor_total_gasto,
usuarios.usuario,
usuarios.bonus,
usuarios.conheceu_de,
usuarios.credito,
usuarios.conta_ativada,
usuarios.transferencias_realizadas,
usuarios.trans_metodo,
usuarios.trans_tipo_conta,
usuarios.trans_conta,
usuarios.trans_titular,
usuarios.trans_banco,
usuarios.trans_agencia,
usuarios.admin,
usuarios.ultimo_login,
pedidos.produtocredito,
usuarios_has_pedidos.usuarios_id_usuario,
usuarios_has_pedidos.pedidos_id_produto
FROM ( ajuda.usuarios_has_pedidos usuarios_has_pedidos
INNER JOIN
ajuda.pedidos pedidos
ON (usuarios_has_pedidos.pedidos_id_produto = pedidos.id_produto))
INNER JOIN
ajuda.usuarios usuarios
ON (usuarios_has_pedidos.usuarios_id_usuario = usuarios.id_usuario)
WHERE (pedidos.produtocredito > 1)


Com as seguintes tabelas:

-- phpMyAdmin SQL Dump
-- version 3.2.0.1
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tempo de Geração: Set 11, 2010 as 12:48 AM
-- Versão do Servidor: 5.1.36
-- Versão do PHP: 5.3.0

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Banco de Dados: `Ajuda`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `pedidos`
--

CREATE TABLE IF NOT EXISTS `pedidos` (
`data` int(50) NOT NULL,
`id_produto` int(20) NOT NULL AUTO_INCREMENT,
`status` varchar(50) COLLATE latin1_general_ci NOT NULL,
`nome_produto` varchar(150) COLLATE latin1_general_ci NOT NULL,
`valor_produto` double(20,2) NOT NULL,
`id_dono` int(20) NOT NULL,
`aprovado` int(2) NOT NULL,
`tipo_pagamento` varchar(50) COLLATE latin1_general_ci NOT NULL,
`produtocredito` int(2) NOT NULL,
PRIMARY KEY (`id_produto`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=13 ;

-- --------------------------------------------------------

--
-- Estrutura da tabela `usuarios`
--

CREATE TABLE IF NOT EXISTS `usuarios` (
`id_usuario` int(20) NOT NULL AUTO_INCREMENT,
`id_patrocinador` int(20) NOT NULL,
`nome` varchar(70) COLLATE latin1_general_ci NOT NULL,
`sexo` int(2) NOT NULL,
`cpf` varchar(20) COLLATE latin1_general_ci DEFAULT NULL,
`senha` varchar(70) COLLATE latin1_general_ci NOT NULL,
`nascimento` int(30) NOT NULL,
`endereco` varchar(150) COLLATE latin1_general_ci DEFAULT NULL,
`ponto_de_referencia` varchar(150) COLLATE latin1_general_ci DEFAULT NULL,
`cep` varchar(30) COLLATE latin1_general_ci DEFAULT NULL,
`bairro` varchar(70) COLLATE latin1_general_ci DEFAULT NULL,
`cidade` varchar(70) COLLATE latin1_general_ci DEFAULT NULL,
`telefone_1` varchar(30) COLLATE latin1_general_ci DEFAULT NULL,
`telefone_2` varchar(30) COLLATE latin1_general_ci DEFAULT NULL,
`email` varchar(100) COLLATE latin1_general_ci NOT NULL,
`estado` varchar(50) COLLATE latin1_general_ci DEFAULT NULL,
`data_de_criacao` int(30) NOT NULL,
`numero` varchar(150) COLLATE latin1_general_ci DEFAULT NULL,
`rg` int(30) DEFAULT NULL,
`emails_da_empresa` int(1) NOT NULL DEFAULT '1',
`emails_do_upline` int(1) NOT NULL DEFAULT '1',
`nome_na_foto` int(1) NOT NULL DEFAULT '1',
`nome_escolhido` varchar(150) COLLATE latin1_general_ci NOT NULL DEFAULT '0',
`valor_total_gasto` double(20,2) NOT NULL DEFAULT '0.00',
`bonus` double(20,2) NOT NULL DEFAULT '0.00',
`usuario` varchar(50) COLLATE latin1_general_ci NOT NULL,
`credito` int(20) NOT NULL DEFAULT '0',
`conheceu_de` varchar(50) COLLATE latin1_general_ci NOT NULL,
`conta_ativada` varchar(50) COLLATE latin1_general_ci NOT NULL,
`transferencias_realizadas` double(20,2) NOT NULL DEFAULT '0.00',
`trans_metodo` varchar(40) COLLATE latin1_general_ci NOT NULL,
`trans_tipo_conta` varchar(40) COLLATE latin1_general_ci NOT NULL,
`trans_conta` varchar(40) COLLATE latin1_general_ci NOT NULL,
`trans_titular` varchar(150) COLLATE latin1_general_ci NOT NULL,
`trans_agencia` varchar(20) COLLATE latin1_general_ci NOT NULL,
`trans_banco` varchar(50) COLLATE latin1_general_ci NOT NULL,
`admin` int(1) NOT NULL DEFAULT '0',
`ultimo_login` int(15) NOT NULL,
PRIMARY KEY (`id_usuario`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=10015 ;

-- --------------------------------------------------------

--
-- Estrutura da tabela `usuarios_has_pedidos`
--

CREATE TABLE IF NOT EXISTS `usuarios_has_pedidos` (
`usuarios_id_usuario` int(20) NOT NULL,
`pedidos_id_produto` int(20) NOT NULL,
PRIMARY KEY (`usuarios_id_usuario`,`pedidos_id_produto`),
KEY `fk_usuarios_has_pedidos_usuarios` (`usuarios_id_usuario`),
KEY `fk_usuarios_has_pedidos_pedidos1` (`pedidos_id_produto`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

--
-- Restrições para as tabelas dumpadas
--

--
-- Restrições para a tabela `usuarios_has_pedidos`
--
ALTER TABLE `usuarios_has_pedidos`
ADD CONSTRAINT `fk_usuarios_has_pedidos_usuarios` FOREIGN KEY (`usuarios_id_usuario`) REFERENCES `usuarios` (`id_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `fk_usuarios_has_pedidos_pedidos1` FOREIGN KEY (`pedidos_id_produto`) REFERENCES `pedidos` (`id_produto`) ON DELETE CASCADE ON UPDATE CASCADE;

Da uma olhada nos atributos que colocastes id, com o relacionamento so precisas das chaves das duas tabelas para as relacionar, e mudei o modelo para InnoBD!

Espero ter ajudado.
Abraços

0
10/09/2010 10:51am
(~7 anos atrás)
Victor Mangia respondeu:
fazer isso em apenas uma SQL não dá.

a solução seria usar condicionais no PHP para fazer tal situação.
caso persista a dúvida poste a estrutura das 2 tabelas que tento lhe ajudar.

abraço

0
10/09/2010 1:38pm
(~7 anos atrás)
Estrutura das tabelas:

CREATE TABLE IF NOT EXISTS `usuarios` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`id_patrocinador` int(20) NOT NULL,
`nome` varchar(70) COLLATE latin1_general_ci NOT NULL,
`sexo` int(2) NOT NULL,
`cpf` varchar(20) COLLATE latin1_general_ci DEFAULT NULL,
`senha` varchar(70) COLLATE latin1_general_ci NOT NULL,
`nascimento` int(30) NOT NULL,
`endereco` varchar(150) COLLATE latin1_general_ci DEFAULT NULL,
`ponto_de_referencia` varchar(150) COLLATE latin1_general_ci DEFAULT NULL,
`cep` varchar(30) COLLATE latin1_general_ci DEFAULT NULL,
`bairro` varchar(70) COLLATE latin1_general_ci DEFAULT NULL,
`cidade` varchar(70) COLLATE latin1_general_ci DEFAULT NULL,
`telefone_1` varchar(30) COLLATE latin1_general_ci DEFAULT NULL,
`telefone_2` varchar(30) COLLATE latin1_general_ci DEFAULT NULL,
`email` varchar(100) COLLATE latin1_general_ci NOT NULL,
`estado` varchar(50) COLLATE latin1_general_ci DEFAULT NULL,
`data_de_criacao` int(30) NOT NULL,
`numero` varchar(150) COLLATE latin1_general_ci DEFAULT NULL,
`rg` int(30) DEFAULT NULL,
`emails_da_empresa` int(1) NOT NULL DEFAULT '1',
`emails_do_upline` int(1) NOT NULL DEFAULT '1',
`nome_na_foto` int(1) NOT NULL DEFAULT '1',
`nome_escolhido` varchar(150) COLLATE latin1_general_ci NOT NULL DEFAULT '0',
`valor_total_gasto` double(20,2) NOT NULL DEFAULT '0.00',
`bonus` double(20,2) NOT NULL DEFAULT '0.00',
`usuario` varchar(50) COLLATE latin1_general_ci NOT NULL,
`credito` int(20) NOT NULL DEFAULT '0',
`conheceu_de` varchar(50) COLLATE latin1_general_ci NOT NULL,
`conta_ativada` varchar(50) COLLATE latin1_general_ci NOT NULL,
`transferencias_realizadas` double(20,2) NOT NULL DEFAULT '0.00',
`trans_metodo` varchar(40) COLLATE latin1_general_ci NOT NULL,
`trans_tipo_conta` varchar(40) COLLATE latin1_general_ci NOT NULL,
`trans_conta` varchar(40) COLLATE latin1_general_ci NOT NULL,
`trans_titular` varchar(150) COLLATE latin1_general_ci NOT NULL,
`trans_agencia` varchar(20) COLLATE latin1_general_ci NOT NULL,
`trans_banco` varchar(50) COLLATE latin1_general_ci NOT NULL,
`admin` int(1) NOT NULL DEFAULT '0',
`ultimo_login` int(15) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=10015 ;


CREATE TABLE IF NOT EXISTS `pedidos` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`data` int(50) NOT NULL,
`id_produto` int(20) NOT NULL,
`status` varchar(50) COLLATE latin1_general_ci NOT NULL,
`nome_produto` varchar(150) COLLATE latin1_general_ci NOT NULL,
`valor_produto` double(20,2) NOT NULL,
`id_dono` int(20) NOT NULL,
`aprovado` int(2) NOT NULL,
`tipo_pagamento` varchar(50) COLLATE latin1_general_ci NOT NULL,
`produtocredito` int(2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=10056 ;


Tentei utilizar a seguinte query mas nao teve o efeito que eu queria:

SELECT *,(select count(*) from `pedidos` WHERE `produtocredito`='0') as total FROM `usuarios` WHERE total='0'

Nesse caso é como eu expliquei a cima, gostaria de filtrar os usuarios que nao tem nenhum pedido com produtocredito = 1

0
10/09/2010 1:46pm
(~7 anos atrás)
Victor Mangia respondeu:
vc pode colocar uma coluna na tabela usuario, especificando se ele tem ou não pedido, fazendo um update neste registro sempre que gerar um pedido.

0
10/09/2010 6:16pm
(~7 anos atrás)
É voce tem razao, acho que seria a melhor maneira de evitar sobrecarregamento de memoria

Nova Resposta:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)