Utilizzando MySQL, come faccio a query di selezione risultato rango di una riga particolare?

StackOverflow https://stackoverflow.com/questions/1262448

  •  12-09-2019
  •  | 
  •  

Domanda

Ho passato un bel po 'di tempo oggi provare varie cose, ma nessuno di loro sembra funzionare. Ecco la mia situazione, mi piacerebbe essere in grado di selezionare il rango di una riga basata su di essa la ID da una fila specificamente ordinato

Per esempio, se la mia domanda è qualcosa di simile:

SELECT id, name FROM people ORDER BY name ASC

Con risultati come:

id   name
3    Andrew
1    Bob
5    Joe
4    John
2    Steve

Mi piacerebbe ottenere il rango (cosa fila finisce nei risultati) senza restituire tutte le righe e loop buttare loro fino a quando riesco a quello che voglio (in PHP).

Per esempio, mi piacerebbe scegliere il 'rango' di 'Steve' in modo che restituisca - in questo caso - 5 (non il suo id, ma il 'rango' del suo nome nella query precedente) .

Allo stesso modo, mi piacerebbe essere in grado di selezionare il rango di qualunque riga ha l'ID di 1. Per questo esempio, mi piacerebbe tornare un 'rango' di 2 (perché questo è quello che in fila conseguenza v'è un ID di 1) e niente altro.

Ho Google'd quanto più ho potuto con risultati diversi ... o avere query molto lento per le tabelle più grandi o di dover creare tutti i tipi di tabelle temporanee e variabili utente (l'ex mi piacerebbe molto per evitare , quest'ultimo suppongo posso vivere con).

Qualsiasi aiuto o intuizione sarebbe molto apprezzato.

È stato utile?

Soluzione

artfulsoftware :

SELECT p1.id, p1.name, COUNT( p2.name ) AS Rank
    FROM people p1
    JOIN people p2 
    ON p1.name < p2.name
    OR (
         p1.name = p2.name
         AND p1.id = p2.id
    )
GROUP BY p1.id, p1.name
ORDER BY p1.name DESC , p1.id DESC
LIMIT 4,1

Altri suggerimenti

Una cosa come questa?

SELECT Row, id, name
FROM (SELECT @row := @row + 1 AS Row, id, name
      FROM people
      ORDER BY name ASC)
WHERE Row = @SomeRowNumber

Se si vuole andare da ID, basta modificare la clausola WHERE.

Prova questo:

SELECT @rownum:=@rownum+1 `rank`, p.id, p.name
FROM people p, (SELECT @rownum:=0) r
ORDER BY name ASC

cerco di questo codice può aiutare ... altro Sto ottenendo risultati da parte degli utenti e caricare tavolo per pic profilo utente e unisco esso che dopo sto calcolando punti utente e smistamento su di loro. Finalmente sto controllando e l'aggiunta di numero di riga per classifica per gli utenti ... InJoy esso. grazie

set @row_num = 0;
set @calp =0;
select  if(@calp=(@calp:=user.cal_points), @row_num, @row_num := @row_num + 1) as row_number,user.* from 
(select user_skills.*,users.username,upload.file_name from user_skills join users on user_skills.user_id=users.id join upload on upload.upload_id=users.profile_pic order by user_skills.cal_points desc) as user
WHERE user.skill_name LIKE  '%ph%'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top