【问题标题】:How to retrieve row number from specific value in a mysql fetch row/array/assoc result via php?如何通过php从mysql获取行/数组/关联结果中的特定值中检索行号?
【发布时间】:2013-12-02 20:15:52
【问题描述】:

假设我在 PHP 中有这个 sql 结果($myresults = mysql_fetch_… assoc/row/array):

SELECT table1.name as name, sum(table2.numbers) as numbers FROM table2 INNER JOIN
 table1 ON table2.fk_id = table1.id GROUP BY name ORDER BY numbers DESC

---------------
| John | 800  |
---------------
| Mark | 500  |
---------------
| Bill | 300  |
---------------

所以我被记录为 Mark ($_SESSION['name'] == "Mark") 并且我想知道值 'Mark' 位于哪一行(在本例中为第 1 行,考虑到第一行是 0)。

我如何通过 PHP 获得它?

谢谢……

编辑:把它想象成一个高分或排行榜表,我不需要用户 ID,但用户现在所在的行...

【问题讨论】:

  • 我想你可以在这里找到答案stackoverflow.com/questions/3126972/mysql-row-number
  • 谢谢,在 grub 之后会仔细阅读!
  • 虽然看起来确实像 Mosty Mostacho 回答的那样,但它会给我错误的答案(请参阅我在他的回答中的评论),就像他的第一个例子一样。他的第二个例子效果很好。

标签: php mysql sql arrays row


【解决方案1】:

您应该以这种方式使用用户定义的变量:

SELECT table1.name as name, sum(table2.numbers) as numbers,
  @rank := @rank + 1 rank
FROM table2
CROSS JOIN (SELECT @rank := 0) init
JOIN table1 ON table2.fk_id = table1.id
GROUP BY name
ORDER BY numbers DESC

再想一想,group by 可能会给您计算 UDV 带来一些麻烦。这是另一种替代方法,但性能不如以前的方法。

SELECT *, @rank := @rank + 1 rank FROM (
    SELECT table1.name as name, sum(table2.numbers) as numbers
    FROM table2
    JOIN table1 ON table2.fk_id = table1.id
    GROUP BY name
) s
CROSS JOIN (SELECT @rank := 0) init
ORDER BY numbers DESC

无论如何,我建议直接在 PHP 中计数。这将更加灵活和高效。

【讨论】:

  • 在 grub 之后测试它!谢谢!顺便说一句,我如何直接在 PHP 中计算它?
  • 你很可能有某种循环来遍历结果,对吧? fetch_assoc 之类的?然后在那里添加一个$counter 变量。在循环外在0 中初始化它,然后在循环内递增它。有你的排名:)
  • 我使用 while 循环获得了排名,但是要打印表格,如“1 - John - 800... 2 - Mark - 500...” 但是如果我需要“你的排名是 #out的 ###",带有 $counter 增量的 while 循环在这里不适用吗?所以我最好用你提供的答案? (我现在要测试它!)
  • 您所说的问题有不同的方法。第一个也是最简单的方法是select count(*) 查询,以便您提前知道总数。或者,如果您没有使用LIMIT 并且您实际上得到了所有结果,那么我很确定有一个 PHP 函数可以计算查询获取的结果数。在使用 UDV 之前,我仍然会采用所有这些方法 :)
  • 您的答案中的第二种方法足以满足我的需要...第一次尝试会给我错误的行#s(由于 sum(),它正在跳过行,就好像保留了行#s对于具有不同数字的相同名称的行..) 比如 1, 5, 8... 而不是 1, 2, 3... 谢谢!!
【解决方案2】:

修改您的 SQL 以选择主 ID 以及其他数据:

SELECT 
    table1.id as id,
    table1.name as name, 
    sum(table2.numbers) as numbers 
FROM 
    table2 
INNER JOIN
    table1 ON table2.fk_id = table1.id 
GROUP BY 
    name 
ORDER BY 
    numbers DESC

【讨论】:

  • 那只会带来用户 ID,但不完全是行索引...... table2 中的数字可能会有所不同,所以今天 Mark 可能在第 1 行,但明天 Mark 可能在第 3 行等等……把它想象成电子游戏高分表
猜你喜欢
  • 1970-01-01
  • 2015-03-14
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多