Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL选择用户排名(大于x小于y)_Php_Mysql_Sql_Select - Fatal编程技术网

Php MYSQL选择用户排名(大于x小于y)

Php MYSQL选择用户排名(大于x小于y),php,mysql,sql,select,Php,Mysql,Sql,Select,我有点被php/Mysql查询卡住了。我有两张桌子: table_users table_ranks ---------------- ------------------------ | id | points | | name | points_needed | ---------------- ------------------------ | 1 | 2 | | lvl0 | 0 | | 2

我有点被php/Mysql查询卡住了。我有两张桌子:

  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       |
----------------    ------------------------
我需要这样的输出:

  • 用户_1=lvl0(因为用户有2分)
  • 用户_2=lvl1(因为用户刚刚达到10分)
  • 用户_4=lvl2(因为用户尚未达到30分)
我想你:)


问候。

试试看,因为桌子设计有点乱

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:=@rank+1 ranks
              FROM table_ranks a, (SELECT @rank:=0) b
              ORDER BY points_needed
            ) x
            LEFT JOIN 
            (
              SELECT name, points_needed, @rank1:=@rank1+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

试试看,由于桌子的设计有点凌乱

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:=@rank+1 ranks
              FROM table_ranks a, (SELECT @rank:=0) b
              ORDER BY points_needed
            ) x
            LEFT JOIN 
            (
              SELECT name, points_needed, @rank1:=@rank1+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

    • 你可以这样做

      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
      

      你可以这样做

      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
      

      那么你尝试了什么?展示你的努力?你试过了吗?我发现了这个:但我对“AS”这个词有点迷茫。而且排名也不完全一样,顺便说一句:\那么你尝试了什么?展示你的努力?你试过了吗?我发现了这个:但我对“AS”这个词有点迷茫。而且排名也不完全一样,顺便说一句:\太棒了!做这项工作,而且是灵活的。非常感谢:)太棒了!做这项工作,而且是灵活的。非常感谢:)这似乎有效,但与@raheel shan的答案相比有点复杂。我认为你的BTWIt似乎有效,但与@raheel shan的答案相比有点复杂。顺便说一句,你觉得怎么样