Ir para conteúdo

Arquivado

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

matheusmarson

Uso de rank no mysql

Recommended Posts

Não, não é não seu eu limitar com Having ele mostra a apenas as 4 mas não são as 4 com mais produtos

O rank não ordenou correto isso


Veja na imagem que vc vai ver que o rank não está correto em relação a qtd

Compartilhar este post


Link para o post
Compartilhar em outros sites

Finalmente, acho que entendi agora...

SELECT
  x.id,
  f.nome_fantasia,
  c.categoria,
  x.id_categoria AS id_categoria,
  x.qtd,
  @count:= IF( @fab_id = x.id_fabricante, @count + 1, 1 ) AS rank,
  @fab_id:= x.id_fabricante AS fab_id
FROM
(
SELECT p.id, p.titulo, p.id_categoria, p.id_fabricante, COUNT(p.id_categoria) as qtd FROM produtos p GROUP BY p.id_fabricante, p.id_categoria ORDER BY p.id_fabricante, qtd DESC
) as x,
produtos_categorias c,
fabricantes f
WHERE x.id_categoria = c.id AND x.id_fabricante = f.id
GROUP BY x.id_fabricante, x.id_categoria
HAVING rank <= 4

Como não tinha ORDER BY na subquery, o próprio banco ordena o resultado conforme o GROUP BY, então estava ordenando pelos id do fabricante e id da categoria...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara perfeito! Muito obrigado. Irá ajudar muita gente isso. Valew!


Problema! Quando foi colocar a query no php não funcionou.

O rank não incrementa

 

 

O código:

$query ="SELECT	x.id, f.nome_fantasia, c.categoria, x.id_categoria AS id_categoria, x.qtd,
					@count:= IF(@fab_id = x.id_fabricante, @count:=@count + 1, 1 ) AS rank,
					@fab_id:= x.id_fabricante AS fab_id
				FROM(
					SELECT p.id, p.titulo, p.id_categoria, p.id_fabricante, COUNT(p.id_categoria) as qtd FROM produtos p GROUP BY p.id_fabricante, p.id_categoria ORDER BY p.id_fabricante, qtd DESC
				) as x, produtos_categorias c, fabricantes f
				WHERE x.id_categoria = c.id AND x.id_fabricante = f.id
				GROUP BY x.id_fabricante, x.id_categoria
				HAVING rank <= '4'";
		$sql = mysql_query($query) or die ("erro: " . mysql_errno($conn) . ", " . mysql_error($conn)); 	
		while($row = @mysql_fetch_array($sql)){

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não retorna erro.

O rank não é formado e com isso mostra todas as categorias e não apenas as 4 com mais quantidade

Veja:

resultado4.jpg

 

Mostra o nome da categoria depois o rank e depois o id do fabricante ok?


Poder ser algo relacionado ao if será?

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.