MySQLを使用して、どのように私は1つの特定の行のクエリ結果のランクを選択しますか?
質問
私はいろいろなことを試して、今日の時間のかなり多くを費やしてきたが、それらのどれも動作するようには思えません。ここに私の状況はだ、私は特にソートされた行からのIDに基づいて行のランクを選択できるようにしたいと思います。
たとえば、私のクエリのようなものである場合:
SELECT id, name FROM people ORDER BY name ASC
のような結果とます:
id name 3 Andrew 1 Bob 5 Joe 4 John 2 Steve
私は、すべての行を返すと私は(PHPで)したいものになるまで、それらを投げるループせずに(それが結果に終わる何行)ランクを取得したいと思います。
それは返すようにたとえば、私は「スティーブ」の「ランク」を選択したいのですが - この場合には - 5(ない彼のIDが、上記のクエリでは彼の名前の「ランク」)ます。
同様に、私はこの例では1のIDを持っているものは何でも行のランクを選択できるようにしたいのですが、私はそれが何であるか、結果の行のだから(2の「ランク」を返したいのですが1のID)と、何もない。
私は結果を変える...のいずれか大きい方のテーブルのために本当に遅いクエリを持つか、一時テーブルおよびユーザー変数(私は本当に避けたいのですが、元のすべての種類を作成することで、私はできる限りGoogle'dました、後者は、私は)私が一緒に暮らすことができると仮定します。
すべてのヘルプや洞察力をいただければ幸いです。
解決
から 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
他のヒント
このような何か?
SELECT Row, id, name
FROM (SELECT @row := @row + 1 AS Row, id, name
FROM people
ORDER BY name ASC)
WHERE Row = @SomeRowNumber
あなたがIDで行きたい場合は、、ちょうどwhere句を変更します。
これを試してください:
SELECT @rownum:=@rownum+1 `rank`, p.id, p.name
FROM people p, (SELECT @rownum:=0) r
ORDER BY name ASC
私はこのコードにしてみてください...他のを助けるかもしれません 私は、ユーザーからの結果を取得し、ユーザープロファイルPIC用のテーブルをアップロードし、私は、ユーザーのポイントを計算し、それらの上に並べ替えています後よりもそれに参加しています。 最後にチェックしていますし、ユーザーのランキングのために行番号を追加... それをInjoy。 感謝
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%'