Ir para conteúdo

POWERED BY:

Arquivado

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

gremio10

[Resolvido] Contar quantos usuários compraram

Recommended Posts

Fala galera, eu estou fazendo uma estatística para ver quantos usuários compraram...

 

aqui minhas tabelas.:

 

CREATE TABLE `buy` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `products_id` int(11) NOT NULL,
 `user_id` int(11) NOT NULL,
 `date_buy` datetime DEFAULT NULL,
 `date_block` datetime DEFAULT NULL,
 `code` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL,
 `liberated` int(1) DEFAULT '0',
 PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

CREATE TABLE `sold` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `products_id` int(11) DEFAULT NULL,
 `sold` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

CREATE TABLE `products` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `informations_id` int(11) NOT NULL,
 `city_id` int(11) NOT NULL,
 `partner_id` int(11) NOT NULL,
 `file_upload_id` int(11) NOT NULL,
 `name` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
 `permalink` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
 `twitter` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
 `of` decimal(5,2) DEFAULT NULL,
 `per` decimal(5,2) DEFAULT NULL,
 `porcent` int(3) DEFAULT NULL,
 `created` datetime DEFAULT NULL,
 `end` datetime DEFAULT NULL,
 `block` datetime DEFAULT NULL,
 `limits` int(11) DEFAULT NULL,
 `stock` int(11) DEFAULT NULL,
 `norder` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

 

e aqui minha Query:

 

SELECT COUNT( user.id ) AS total FROM buy  INNER JOIN USER ON ( user.id = buy.user_id )  INNER JOIN products ON ( products.id = buy.products_id )  INNER JOIN sold ON ( sold.products_id = products.id ) GROUP BY user.id, buy.user_id;

 

Só que assim, na minha tabela buy, eu tenho 10 registros do id 1 e uma do registro 3, então essa query retorna 10-1, e eu queria que ele me retornasse apenas 2 :lol:

 

como faço isso ?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

[table=Numeric Types - MySQL]

[tr] [td]Type[/td] [td]Minimum Value[/td] [td]Maximum Value[/td] [/tr] [tr] [td]TINYINT[/td] [td]-128[/td] [td]127[/td] [/tr] [tr] [td]SMALLINT[/td] [td]-32768[/td] [td]32767[/td] [/tr] [tr] [td]MEDIUMINT[/td] [td]-8388608[/td] [td]8388607[/td] [/tr] [tr] [td]INT[/td] [td]-2147483648[/td] [td]2147483647[/td] [/tr] [tr] [td]MEDIUMINT[/td] [td]-9223372036854775808[/td] [td]9223372036854775807[/td] [/tr] [/table]

 

Nota a diferença agora ? você deixa seu campo adequado a um tipo de valor, e limitado a um tipo de valor. http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview.html

 

Exemplo, você tem um drop box, com 6 opções, então você tem um campo na tabela que vai representar a opção selecionada no drop box, você usa um campo do tipo varchar ou enum ? eu usaria enum, porque ? se eu tenho 6 opções, e sei que serão mantidas apenas 6, eu tenho apenas 6 valores que podem estar gravados naquele campo, essa situação aplica-se pra campos do tipo 'gênero', etc ..

 

Eu pra te falar verdade, demoro umas 3 ~ 4 semanas pra modelar um banco( dependendo da aplicação ), porque é bom ter o banco com um ótimo funcionamento, do que uma aplicação problemática, e ter problemas com o banco, evitando o surgimento de 'gambiarras' no código.

 

Outra coisa que não comentei referente a sua modelagem, é porque você grava 10 registros do id 1 pra um produto ?

se ele comprar 100 vezes, você vai ter 100 registros ? se 100 clientes comprarem 100 vezes 100 produtos, você vai ter 10.000 registros ? ou estou enganado ?

 

Se for 10 registros pra 10 produtos, menos mal, mas aí você tem que utilizar cláusula 'where', você vai selecionar todo mundo que comprou AQUELE produto, ou o cliente que comprou AQUELE produto.

 

Desejo estar enganado, pois muita gente comente esse erro, em sistemas de POSTS por exemplo, algumas pessoas aplicam um COUNT pra cada post do usuário, ou seja, conta tudo que estiver na tabela de posts agrupando por id de usuário, e depois relaciona, é muita gente faz o certo, que é gravar em um campo junto com os dados do usuário e fazer update quando um post for excluído / inserido.

;)

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.