Ir para conteúdo

POWERED BY:

Arquivado

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

Jordan Pinheiro_147113

[Resolvido] Rank ou top sql php

Recommended Posts

Galera quero montar um rank de indicações fiz mais o menos assim

 

SELECT COUNT(indicado_fb) as IndicadosTotal, nome, email FROM clientes ORDER BY IndicadosTotal DESC LIMIT 5

 

toda vez que uma pessoa é cadastrada vindo de uma indicação o id dela de indicado fica gravado em (indicado_fb)

 

eu quero contar quem teve mais indicados e criar um rank com os 5 mais

 

nessa consulta pq eu passei a cima ele retorna apenas 1...

 

IndicadosTotal	| nome               |	email
1820	          Matheus Andrade	theu.andrade.b@hotmail.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa faz tempo que não posto aqui hhehehhe

 

Então kra você está fazendo erro o seu comando SQL

 

Quando você faz um SELECT count(*) ele somente irá retorna 1 linha sempre pois você está querendo saber a quantidade referente a query que você está executando.. por exemplo

 

SELECT count(*) FROM usuario WHERE idade = 20;

 

Imagina que tenho no banco registrado 5000 usuarios que tenha 20 anos então irá retorna para mim 5000.

 

Agora no seu caso você deve fazer o count() junto com o um GROUP BY em indicado_fb ficando assim:

 

SELECT 
  count(indicado_fb) 
FROM 
  clientes
GROUP BY indicado_fb 
ORDER BY count(indicado_fb) DESC
LIMIT 5

 

Bem como você está utilizando o MYSQL e bem provavel que ele deixe você selecionar o NOME e EMAIL junto mais kra não faça isso pq quando a gente faz um GROUP BY no seu caso em indicado_fb conferteza temos varios nomes diferente relacionado a essa indicação que são as pessoas que foram registrado por essa indicação então qual nome irá retorna? você nao sabe e niguem vai saber vai depender do Banco para ele selecionar um pode vim Manoel uma hora Joao outra hora.. entao vou passar a query que você deve usar nessa caso:

 

SELECT 
  c.nome, 
  c.email,
  (SELECT count(c2.indicado_fb) FROM clientes c2 WHERE c2.indicado_fb = c.id_cliente) total_indicacoe
FROM 
  clientes c
WHERE
  c.id_cliente IN (SELECT c3.indicado_fb FROM clientes c3 GROUP BY c3.indicado_fb ORDER BY count(c3.indicado_fb) DESC LIMIT 5)

 

Assim você terá um resultado real dos clientes que indicaram mais.

 

Espero ter ajudado ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

muito obrigado pela atenção!

 

mas ele retorna esse erro

#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

 

assim deu super certo

 

SELECT COUNT( indicado_fb ) , nome, email
FROM clientes
GROUP BY indicado_fb
ORDER BY COUNT( indicado_fb ) DESC 
LIMIT 5

 

mas ai ele retorna o nome de quem me indicou e não o meu nome

Compartilhar este post


Link para o post
Compartilhar em outros sites

Arrumei..

 

SELECT 
  c.nome, 
  c.email,
  (SELECT COUNT(indicado_fb) FROM clientes WHERE indicado_fb = c.id_cliente) total_indicacoe
FROM 
  clientes c
  JOIN (SELECT indicado_fb FROM clientes GROUP BY indicado_fb ORDER BY COUNT(indicado_fb) DESC LIMIT 5) c2
ON(c2.indicado_fb = c.id_cliente)
ORDER BY total_indicacoe DESC;

 

Esqueci que num aceita o LIMIT dentro do IN entao eu fiz um JOIN baseado em uma subquery.

 

E quanto a sua query retorna la o indicado é aquilo que eu disse ele vai retorna alguém que te indico se você tiver 1000 registro na indicação x você terá 1000 probabilidades de retorno diferente de nome.

 

Agora com a query acima vai ficar certinho ;)

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

rsrs ele ainda retorna

 

#1054 - Unknown column 'c.id_cliente' in 'where clause'

 

lindo

 

Jordan Pinheiro	caburas@hotmail.com	865
Grasiela Morais Sandes	grasi_cat_10@hotmail.com	207
Jessica Oliveira	jel-oliveira@hotmail.com	226
Adrielle Bonfim	adrielle.gatynha@hotmail.com	97
Luysa Duarte	maria_luysaa@hotmail.com	130

 

 

consulta

 

SELECT 
  c.nome, 
  c.email,
  (SELECT COUNT(indicado_fb) FROM clientes WHERE indicado_fb = c.facebook) total_indicacoe
FROM 
  clientes c
  JOIN (SELECT indicado_fb FROM clientes GROUP BY indicado_fb ORDER BY COUNT(indicado_fb) DESC LIMIT 5) c2
       ON(c2.indicado_fb = c.facebook)

 

resolvido! muito obrigado!

 

não entendi pq o total de indicações n ficou em ordem desc

Compartilhar este post


Link para o post
Compartilhar em outros sites

É que eu nao sabia qual era a sua referencia se era um id_cliente e tals.. você so precisava alterar a referencia.

 

Eu corrigi la o order by precisava acrecentar o order by na query principal para o total_indicacao

 

Da uma olhada la novamente na ultima query que montei você vai ver que tem o ORDER BY no final agora

Compartilhar este post


Link para o post
Compartilhar em outros sites

BOTEI ASSIM... ACHO Q FOI

 

SELECT c.nome, c.email, (

 

SELECT COUNT( indicado_fb )

FROM clientes

WHERE indicado_fb = c.facebook

)total_indicacoe

FROM clientes c

JOIN (

 

SELECT indicado_fb

FROM clientes

GROUP BY indicado_fb

ORDER BY COUNT( indicado_fb ) DESC

LIMIT 5

)c2 ON ( c2.indicado_fb = c.facebook )

ORDER BY total_indicacoe DESC

LIMIT 0 , 30

 

VOCÊ ACHA Q DA FORMA ACIMA É UM RESULTADO 100% FIÉL... É PARA MEU APP NO FACE VOU DAR UM PRÊMIO MUITO GRANDE E N QUERO ERRAR... PARA N TER Q DAR DUAS VEZES O PRÊMIO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem o Order By está certo agora o LIMIT é desnecessário pois a SUBQUERY já está fazendo o papel do LIMIT

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.