Ir para conteúdo

POWERED BY:

Arquivado

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

Elizandro Tavares

Pegar o número da linha com WHERE mysql

Recommended Posts

Boa Tarde, gostaria de pegar o número da linha onde possui o valor que preciso.

SET @linha=0;
SELECT (@linha:=@linha + 1) AS numerolinha, fornecedor, total FROM controleconserto

numerolinha | fornecedor | total

1 fulano 320
2 ciclano 80
3 boltrano 80
...
20 cara 70

Essa query funciona certinho porém lista todos os registro.

Eu precisaria que ela listasse apenas o registro que tivesse como fornecedor o nome... exemplo:

SET @linha=0;
SELECT (@linha:=@linha + 1) AS numerolinha, fornecedor, total FROM controleconserto WHEREfornecedor='cara'

porém ele retorna como a linha 1 e não como a 20

numerolinha | fornecedor | total

1 cara 70

Agradeço a colaboração.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voce pode usar subquery

SET @linha=0;

SELECT * FROM 
(SELECT 
   (@linha:=@linha + 1) AS numerolinha, 
   fornecedor, 
   total 

FROM controleconserto
) 

WHERE fornecedor='cara'

Repare que ele conta tudo, mas na query de fora ele filtra.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema fica pelo fato de que você tem que contar até chegar ao número adequado. O MySQL não possui uma estrutura de row como outros SGBDs.

A função do kelvin é adequada para a situação. Mas pode perder performance ao longo do tempo (se houverem muitos dados a serem contados). O que acredito não seja o caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se fosse possível somente com o autoincrement, o ID seria o suficiente. Entretanto, ao excluir um registro, já quebraria a ordem.

Seria, adequado, também, utilizar uma coluna que fosse preenchida com o valor. Caso de insert é sempre o max(column) + 1 ou count(*) + 1. No caso de uma exclusão, deve ser refeita toda a contagem.

Caso fosse possível utilizar triggers, poderia até saber qual a linha que foi excluída e já recalcular...

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função que o Kelvim passou funcionou perfeitamente, porém me surgiu a necessidade de Somar os consertos e agrupar para montar um ranking.

o usuário fulano por exemplo tem os consertos 100+50+150

usei um SUM(total) para calcular e um Group by para unir os fornecedores, montar o ranking dos primeiros 5 e mostrar os 5 mais a posição do usuário atual.

Posição quantidade consertos

1º - Fulano 300

2º - Ciclano 320

3º - Beltrano 410

4º - Elizandro 460

5º - Kelvim 510

Seu Ranking "Cara" -> é 20 910 ' aqui está o problema, pois não consigo pegar a posição no ranking que o usuário ficou.

No caso eu gostaria que listasse o total dos primeiros 5 e mostrasse o ranking do usuário atual.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez o gabriel possa ajudar melhor, eu diria para você fazer em duas consultas, uma simples com um top 5 e outra como colocada em cima

SELECT top 5
   (@linha:=@linha + 1) AS numerolinha, 
   fornecedor, 
   total 
 
FROM controleconserto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo fiz o top 5 e já está funcionando...

Agora para usar um SUM(total) dos consertos e um GROUP by fornecedores pegar apenas a linha que está o fornecedor "cara" está complicado.

	SET @linha=0;
	 
	SELECT * FROM 
	(SELECT 
	(@linha:=@linha + 1) AS numerolinha, 
	fornecedor, 
	total 
	 
	FROM controleconserto
	) as resultado
	 

me mostra todos certinho, porém poderia gerar as linhas após ter o SUM (total) e do GROUP by fornecedores

ai eu teria o total consertos dos fornecedores e a linha, onde após eu filtraria pelo WHERE fornecedor='cara'

Grato pela colaboração.

Compartilhar este post


Link para o post
Compartilhar em outros sites
O group by e o sum seriam o normal. dentro do select interno.


sum(total)


FROM controleconserto group by fornecedor

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.