2013-02-26 2 views
1

나는 php/mysql 질의에 조금 갇혀있다. 나는이 같은 OUPUT 필요MYSQL SELECT rank of user (x보다 작고 y보다 작음)

table_users    table_ranks 
---------------- ------------------------ 
| id | points | | name | points_needed | 
---------------- ------------------------ 
| 1 | 2 | | lvl0 |  0  | 
| 2 | 10 | | lvl1 |  10  | 
| 3 | 21 | | lvl2 |  20  | 
| 4 | 29 | | lvl3 |  30  | 
---------------- ------------------------ 

: 나는 2 개 테이블을 가지고

  • USER_1 = lvl0 (사용자가 2 점을 가지고 있기 때문에)
  • User_2 = lvl1 (사용자가 10 점에 도달 단지 때문에)
  • ...
  • User_4 = lvl2
,536 (사용자가 아직 30 점에 도달하지 않았기 때문에)

당신을 생각하십시오 :)

감사합니다.

+0

그래서 무엇을 시도 했습니까? – Blender

+0

노력 하시겠습니까? 시도한 쿼리? – Rikesh

+0

나는 이것을 발견했다 : http://stackoverflow.com/questions/1293817/mysql-get-users-rank 그러나 나는 "AS"물건에서 약간 길을 잃었다. 그리고 BTW와 똑같은 종류가 아닙니다 : \ – hawkidoki

답변

1

당신이

SELECT 
    tu.id, 
    tr.name, 
    tu.points 
FROM table_ranks as tr 
    LEFT JOIN (SELECT * FROM table_ranks LIMIT 1,69596585953484) as l 
    ON l.points_needed = (SELECT MIN(points_needed) FROM table_ranks WHERE points_needed > tr.points_needed limit 1) 
    LEFT OUTER JOIN table_users AS tu ON tu.points >= tr.points_needed AND tu.points < l.points_needed 
WHERE tu.id IS NOT NULL 
group by tu.id 

Fiddle

처럼 그것을 할 수 있습니다 제공

출력

------------------------- 
| id | points | name | 
------------------------- 
| 1 | lvl0 | 2 | 
| 2 | lvl1 | 10 | 
| 3 | lvl2 | 21 | 
| 4 | lvl2 | 29 | 
------------------------- 
+0

굉장! 일을하고 융통성이 있습니다. 매우 감사 :) – hawkidoki

0

이 시도 인해 테이블 ​​디자인에 지저분한 조금,

SELECT u.*, r.name 
FROM table_users u 
     INNER JOIN 
     (
      SELECT x.name, 
        x.points_needed start_point, 
        COALESCE(y.points_needed - 1, 2000000) end_point 
      FROM 
      (
       SELECT name, points_needed, @rank:[email protected]+1 ranks 
       FROM table_ranks a, (SELECT @rank:=0) b 
       ORDER BY points_needed 
      ) x 
      LEFT JOIN 
      (
       SELECT name, points_needed, @rank1:[email protected]+1 ranks 
       FROM table_ranks a, (SELECT @rank1:=0) b 
       ORDER BY points_needed 
      ) y ON x.ranks+1 = y.ranks 
     ) r ON u.points BETWEEN r.start_point AND r.end_point 
+0

작동하는 것처럼 보이지만, @ raheel-shan의 답변과 비교하면 약간 복잡합니다. 당신 생각 BTW – hawkidoki