Ir para conteúdo

POWERED BY:

Arquivado

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

e3tadashi

ORDER BY & count()

Recommended Posts

Olá galera!

 

Estou tentando fazer um request onde puxo uma lista de quantidade de produtos registradas em uma loja e gostaria de ordena-la pela quantidade de produtos registrados na mesma.

 

Algo do tipo:

 

$sql = "SELECT id, COUNT(id) FROM produtos WHERE ".$resultado['shop']." <> '' ORDER BY COUNT(id)";

 

Tudo funciona certinho, menos o ORDER BY que não está dando efeito.

 

Como faço essa lista ordenada por count()?

 

Abraços!

 

e Feliz Natal!

hohoho...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta aí:

$sql = "SELECT id, COUNT(id) as teste FROM produtos WHERE ".$resultado['shop']." <> '' ORDER BY teste";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso deve estar acontecendo por existir somente 01 valor para cada ID. Caso existam ids repetidos, deve fazer a soma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara esse teu select ta errado

pq não da para agrupara pelo id para o id e alto incremente. e nunca vai se repetir

 

oq você que fazer explique

 

você que exibir os id. e esses id se não se repetir para que você que contar?

pq o count vai sempre ser 1;

 

ou você quer exibir o count do resultado so select?

se for:

 

$sql = "SELECT id, COUNT(*) FROM produtos WHERE ".$resultado['shop']." <> '' ORDER BY COUNT(*)";

 

se esse id não for autoincrement e se repetir

você pode contar quantas veses aquele id aparece desta forma

 

$sql = "SELECT id, COUNT(*) FROM produtos WHERE ".$resultado['shop']." <> '' Group By id ORDER BY COUNT(*)";

Compartilhar este post


Link para o post
Compartilhar em outros sites

O atual está assim:

 

$sql = "SELECT id, COUNT(*) as products FROM produtos WHERE ".$resultado['shop']." <> ''";

 

Assim ele mostra o numero de produtos que estão nas respectivas lojas.

 

As id's dos produtos são auto incremento.

 

Agora eu queria poder ordenar essa exibição pelo numero de produtos da loja, ou seja, pelo COUNT(*).

 

Já tentei monte de coisa aqui e não ta indo... x.x

Compartilhar este post


Link para o post
Compartilhar em outros sites

$sql = 'SELECT loja, COUNT(id) as total_produtos FROM produtos WHERE loja <> "" ORDER BY total_produtos;

Isto, considerando que:

- id é um autoincremento, consequentemente único, para cada registro;

- produtos e o nome da tabela;

- loja é campo que relaciona determinado produto a uma determinada loja;

- campo loja não está vazio (condição/where).

 

Adeque ao seu código e poste o resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$verificar = mysql_query("SELECT * FROM produtos WHERE loja ORDER BY id DESC");

$x= mysql_num_rows($verificar);

 

<?=$x?> // total

<?=$x['nome']?> // nome do produto espero ajuda se for isso que estou pessando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem certesa que desta forma esta dando certo?

 

pq deste geito o count e uma função agregada, e prescisa de um group by caso seja exibido com outro.

 

 

como falei acho q este select esta errado.

poderia de certo desta forma.

 

Select loja,Count(*) From tabela Where trim(loja) <> "" and loja is not null 
group by loja

Compartilhar este post


Link para o post
Compartilhar em outros sites

como falei acho q este select esta errado.

Pode ter a certeza de que está errado.

 

@InterPlanet já deu 99% da solução, exceto por um detalhe:

- campo loja não está vazio (condição/where).

 

'loja <> ""'

Apesar de, em determinados casos, você pode salvar uma string vazia em um campo, isso está errado. Você deve salvar conteúdo ou manter o campo como null.

 

Se eu não me engano, o SGBD MySQL reconhece "" (string vazia) como NULL, outros SGBDs reconhecem como string vazia.

 

O correto seria:

'WHERE loja IS NOT NULL'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então galera,

 

No meu caso, a loja é uma coluna da tabela produtos.

 

Funciona assim...

 

Quando eu registro uma loja, eu crio uma coluna na tabela produto com o nome daquela loja.

 

Quando insiro um produto na loja, eu preencho a respectiva coluna da loja com a id do produto.

 

E quando vou imprimir os produtos da loja, eu leio a coluna da respectiva loja, vejo as ids, e busco os respectivos produtos na tabela produtos.

 

O que eu estou tentando imprimir no caso, é a quantidade de produtos em uma loja. E aproveitei que como as ids dos produtos são únicas, tentei fazer um count(id) na tabela produtos, agrupando pela coluna da respectiva loja.

 

Existe uma tabela lojas, apenas com os nomes das lojas e ids. Mas pra buscar a quantidade de produtos eu olho pra coluna na tabela produtos.

 

Eu consigo imprimir a quantidade de cada loja.

 

Mas eu queria exibir as lojas em ordem dessa quantidade. Isso que não está dando certo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara tem algo errado.

 

se esse select esta dando certo, então tem algo errado no seu banco

 

não entedie quando você falo

 

Quando eu registro uma loja, eu crio uma coluna na tabela produto com o nome daquela loja.

 

você cria uma coluna no bd?

 

se tiver criando uma coluna no banco esta muito errado. rsrsrrs.

acho q você digito errado.

 

 

como todo mundo ai falo que ta errado, e mais facil você esta errando do que todo mundo não acha.

ou você não esta esplicando direito.

 

 

fassa assim, para poder lhe ajudar.

 

coloque ai as tabelas que você esta usando nesta consulta.

 

ex:

 

#loja

id

nome

etc

 

#produtos

id

nome

etc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez a forma como eu implementei as coisas é que esteja de um jeito que não possibilite o que estou querendo...

 

Tabela Lojas:


CREATE TABLE IF NOT EXISTS `lojas` (
 `id` int(50) NOT NULL AUTO_INCREMENT,
 `shop` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `description` text COLLATE utf8_unicode_ci NOT NULL,
 `logo` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `order_by` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `product_width` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
 `slider` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16 ;

 

Tabela produtos:

 


CREATE TABLE IF NOT EXISTS `produtos` (
 `id` int(5) NOT NULL AUTO_INCREMENT,
 `image` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `product` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `categorie` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `subcategorie` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `brand` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `title` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
 `subtitle` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
 `description` longtext COLLATE utf8_unicode_ci,
 `price` float DEFAULT NULL,
 `status` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
 `datetime` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
 `acessorios` varchar(5) COLLATE utf8_unicode_ci DEFAULT '',
 `calcados` varchar(5) COLLATE utf8_unicode_ci DEFAULT '',
 `beleza` varchar(5) COLLATE utf8_unicode_ci DEFAULT '',
 `chapeis` varchar(5) COLLATE utf8_unicode_ci DEFAULT '',
 `todos` varchar(5) COLLATE utf8_unicode_ci DEFAULT '',
 `shops_teste` varchar(5) COLLATE utf8_unicode_ci DEFAULT '',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=128 ;


 

As colunas: acessorios, calcados, beleza, chapeis, todos e shops_teste são lojas que eu criei na pagina de administração das lojas, e são inseridas dessa forma:

 


$sql = "INSERT INTO lojas (shop, description, logo, order_by, product_width) VALUES ('".$_shop."', '".$_description."', '".$nome_imagem."', '".$_POST['order_by']."', '5')";
$query = mysql_query($sql);

$sql = "ALTER TABLE produtos ADD ".$_shop." varchar(5) DEFAULT ''";
$query = mysql_query($sql);

 

Ou seja, eu registro a loja na tabela lojas, e crio uma coluna na tabela produtos.

 

Inserindo um produto na loja:

 


$sql = "UPDATE produtos SET ".$loja['shop']." = '".$_POST['item']."' WHERE id = '".$_POST['item']."'";
$query = mysql_query($sql);

 

Ou seja, eu guardo na coluna da respectiva loja, a id do respectivo produto.

 

Então na pagina do cliente, quando quero exibir os produtos de uma loja:

 


<div id="showcase">
<div class='showcase_row'>
<?php
	switch($config_ini){
		case 'first': {
			$sql = "SELECT * FROM produtos WHERE ".$loja." <> '' AND categorie = '".$link_cat."' ".$link_sub;
			break;
									}

		case 'all': {
			$sql = "SELECT * FROM produtos WHERE ".$loja." <> '' ".$link_cat." ".$link_sub;
			break;	
		}
	}

	$query = mysql_query($sql);
	while($resultado = mysql_fetch_assoc($query)){
		echo "
                           <div class='showcase_box' style='width:".$product_width."'>
				<a><img class='img' src='produtos/".$resultado['image']."' /></a>
				<div class='title'><span class='padL'>".$resultado['title']."</span></div>
				<div class='subtitle'>".$resultado['subtitle']."</div>
				<div class='price'>R$ ".$resultado['price']."</div>
			</div>
		";
	}
?>
                     </div>

                    </div><!--showcase-->

 

Agora na pagina de administração das lojas, quero exibir as lojas e a quantidade de produtos registrados nela.

 


$sql = "SELECT * FROM lojas";
$query = mysql_query($sql);
while($resultado = mysql_fetch_assoc($query)){

$sql = "SELECT id, COUNT(id) AS products FROM produtos WHERE ".$resultado['shop']." <> ''";
$query2 = mysql_query($sql);
$quantidade = mysql_fetch_array($query2);

/*imprimindo os dados...*/
echo"
<tr>
<td>".$resultado['shop']."</td>
<td><img class='mini_logo' src='lojas/".$resultado['logo']."' /></td>
<td>".$quantidade['products']."</td>
<td>".$resultado['description']."</td>
<td>".$resultado['order_by']."</td>
<td>".$resultado['product_width']."</td>
<td>".$resultado['slider']."</td>
</tr>
";
}

 

Da forma que esta implementado, há jeito de exibir as lojas em ordem da quantidade de produtos registrados na loja?

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.