Ir para conteúdo

POWERED BY:

Arquivado

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

Henrique Barcelos

[Resolvido] Problema com query e subquery

Recommended Posts

Eu sei que estou fazendo uma cagada fenomenal, mas não consegui construir essa query de outra maneira:

SELECT * FROM anunciantes a, cidades c, niveis_acesso_anunciantes n		WHERE a.cod_cidade = c.cod_cidade AND a.cod_nivel = n.cod_nivel		AND SELECT COUNT(*) AS total_anuncios FROM anuncios an, anunciantes a WHERE a.cod_anunciante = an.cod_anunciante
Existe algum jeito de pegar o total de anuncios cadastrados por um anunciante (tabela anunciantes) na tabela anuncios, relacionadas por uma FK?

 

Obrigado Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não...

 

Mas não congigo montar de outro jeito...

 

Eu tenho a tabela anunciantes e anuncios (relevantes para o meu problema)

 

Eu quero retornar, além dos dados do anunciante, o total de anúncios que cada anunciante cadastrou.

 

Deu pra pegar a idéia?

 

Valeu Imagem Postada

Compartilhar este post


Link para o post
Compartilhar em outros sites

poste a estrutura das tabelas

Compartilhar este post


Link para o post
Compartilhar em outros sites

As estruturas são essas... só não incluí a FK que relaciona as duas...

--
-- Estrutura da tabela `anunciantes`
--

CREATE TABLE IF NOT EXISTS `anunciantes` (
 `cod_anunciante` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
 `cod_nivel` tinyint(3) unsigned NOT NULL,
 `cod_cidade` tinyint(3) unsigned NOT NULL,
 `nome_anunciante` varchar(60) COLLATE utf8_bin DEFAULT NULL,
 `tipo_anunciante` enum('fisico','juridico') COLLATE utf8_bin DEFAULT NULL,
 `max_anuncios` tinyint(3) unsigned DEFAULT NULL,
 `cpf_cnpj` varchar(18) COLLATE utf8_bin DEFAULT NULL,
 `fone_anunciante` char(14) COLLATE utf8_bin DEFAULT NULL,
 `email_anunciante` varchar(60) COLLATE utf8_bin DEFAULT NULL,
 `login_anunciante` varchar(20) COLLATE utf8_bin DEFAULT NULL,
 `senha_anunciante` char(32) COLLATE utf8_bin DEFAULT NULL,
 PRIMARY KEY (`cod_anunciante`),
 KEY `anunciantes_FKIndex1` (`cod_nivel`),
 KEY `anunciantes_ibfk2` (`cod_cidade`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=3 ;



--
-- Estrutura da tabela `anuncios`
--

CREATE TABLE IF NOT EXISTS `anuncios` (
 `cod_banner` int(8) unsigned NOT NULL AUTO_INCREMENT,
 `cod_cidade` tinyint(3) unsigned NOT NULL,
 `cod_regiao` tinyint(3) unsigned NOT NULL,
 `nome_banner` varchar(90) COLLATE utf8_bin NOT NULL,
 `img_banner` varchar(45) COLLATE utf8_bin NOT NULL,
 PRIMARY KEY (`cod_banner`),
 KEY `banners_ibfk_1` (`cod_cidade`),
 KEY `banners_ibfk_2` (`cod_regiao`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=11 ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

não vi suas tabelas, mas assim nao funciona?

SELECT *, (SELECT COUNT(*) FROM anuncios) AS total_anuncios FROM anunciantes a, cidades c, niveis_acesso_anunciantes n
                WHERE a.cod_cidade = c.cod_cidade AND a.cod_nivel = n.cod_nivel
                AND a.cod_anunciante = an.cod_anunciante

só tem que ver as ligações e tal.

 

mas se entendi o que você quer assim funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como anuncios se liga à anunciantes ?

 

Seria uma simples join com count, não ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ooops... Postei a tabela errada... Sono de menos esses ultimos dias... ashushsauh

 

A correta é essa:

 

CREATE TABLE IF NOT EXISTS `classificados` (
 `cod_classificado` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `cod_categoria` tinyint(3) unsigned NOT NULL,
 `cod_anunciante` mediumint(8) unsigned NOT NULL,
 `titulo_classificado` varchar(60) COLLATE utf8_bin DEFAULT NULL,
 `texto_classificado` tinytext COLLATE utf8_bin,
 `valor_classificado` float(8,2) DEFAULT NULL,
 `img_classificado` char(32) COLLATE utf8_bin DEFAULT NULL,
 PRIMARY KEY (`cod_classificado`),
 KEY `classificados_FKIndex1` (`cod_anunciante`),
 KEY `classificados_FKIndex2` (`cod_categoria`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=5 ;

O campo cod_anunciante é uma FK relacionada à tabela anunciantes:

CREATE TABLE IF NOT EXISTS `anunciantes` (
 `cod_anunciante` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
 `cod_nivel` tinyint(3) unsigned NOT NULL,
 `cod_cidade` tinyint(3) unsigned NOT NULL,
 `nome_anunciante` varchar(60) COLLATE utf8_bin DEFAULT NULL,
 `tipo_anunciante` enum('fisico','juridico') COLLATE utf8_bin DEFAULT NULL,
 `max_anuncios` tinyint(3) unsigned DEFAULT NULL,
 `cpf_cnpj` varchar(18) COLLATE utf8_bin DEFAULT NULL,
 `fone_anunciante` char(14) COLLATE utf8_bin DEFAULT NULL,
 `email_anunciante` varchar(60) COLLATE utf8_bin DEFAULT NULL,
 `login_anunciante` varchar(20) COLLATE utf8_bin DEFAULT NULL,
 `senha_anunciante` char(32) COLLATE utf8_bin DEFAULT NULL,
 PRIMARY KEY (`cod_anunciante`),
 KEY `anunciantes_FKIndex1` (`cod_nivel`),
 KEY `anunciantes_ibfk2` (`cod_cidade`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=3 ;
Vou tentar a sugestão do colega EuToComProblema!

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sugestão do amigos quaaaase serviu...

 

Fiz uma modificação só e funcionou perfeitamente Imagem Postada

SELECT *, (SELECT COUNT(*) FROM classificados cl WHERE cl.cod_anunciante = a.cod_anunciante) AS total_anuncios FROM anunciantes a, cidades c, niveis_acesso_anunciantes n		WHERE a.cod_cidade = c.cod_cidade AND a.cod_nivel = n.cod_nivel
Antes eu fazia só a busca dos anunciantes, depois fazia um loop para percorrer o array de usuários e pegar a qtde de anuncios de cada um...

 

Agora já sei como faz :joia:

 

Obrigado a todos :clap:

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.