gremio10 14 Denunciar post Postado Agosto 26, 2011 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
Caio Cardoso 0 Denunciar post Postado Agosto 26, 2011 facil fera!! utilize a função DISTINCT: SELECT COUNT( distinct user.id ) AS total ... Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Agosto 27, 2011 Cara, valeeeeeeu !! funcionou direitinho!! abrçs Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Agosto 27, 2011 Gremio, você não conhece campos do tipo 'tinyint' , 'smallint' , 'boolean' ? `liberated` int(1) DEFAULT '0', Compartilhar este post Link para o post Compartilhar em outros sites
gremio10 14 Denunciar post Postado Agosto 27, 2011 Qual a diferença Andrey Knupp ? Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Agosto 27, 2011 [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