我有一个具有以下结构和信息的 SQL 数据库:
idClub Pts GD
1 3 2
2 4 0
3 5 -1
4 0 -3
5 9 5
6 1 2
7 3 1
8 0 -2
9 6 0
10 7 5
如果如果做:
$result = $mysqli->query("SELECT * FROM table ORDER BY Pts Desc, GD Desc");
它将提供这个:
idClub Pts GD
5 9 5 //Row Number = 1
10 7 5 //Row Number = 2
9 6 0 //Row Number = 3
3 5 -1 //Row Number = 4
2 4 0 //Row Number = 5
1 3 2 //Row Number = 6
7 3 1 //Row Number = 7
6 1 2 //Row Number = 8
8 0 -2 //Row Number = 9
4 0 -3 //Row Number = 10
每个 idClub 都有自己的个人资料页面 - profile.php?Id=X - 我需要在其中显示带有 id 的俱乐部以及表格上方和下方的 2 个球队。
有什么方法可以知道给定值在 $result 中的行号(位置)? 例如profile.php?id=3 会是4;对于 profile.php?Id=1 它将是 6,依此类推。
例如,对于 profile.php?Id=3,我需要一个提供以下内容的 $result:
idClub Pts GD
10 7 5
9 6 0
3 5 -1
2 4 0
1 3 2
提前致谢。
最佳答案
首先,接受你现在的问题,
SELECT
*
FROM
atable
ORDER BY
Pts DESC,
GD DESC
并使用涉及变量分配的众所周知的技术为其添加行编号:
SELECT
atable.*,
@row := @row + 1 AS row
FROM
atable
CROSS JOIN
(SELECT @row := 0) AS p
ORDER BY
Pts DESC,
GD DESC
这将根据指定的顺序为您的行分配排名。现在,如果我们知道与指定的 idClub
关联的行号,我们只需将上述查询用作派生表并根据条件过滤其结果集
WHERE
row BETWEEN @idXrow - 2 AND @idXrow + 2
而且我们可以找出@idXrow
值。为此,我们可以向子查询添加一个变量赋值:
@idXrow := CASE idClub WHEN 3 THEN @row ELSE @idXrow END
其中 3
是指定的 idClub
值 – 在您的最终查询中,它可能需要替换为参数引用。无论如何,complete query完成这项工作看起来像这样:
SELECT
row,
idClub,
Pts,
GD
FROM
(
SELECT
atable.*,
@row := @row + 1 AS row,
@idXrow := CASE idClub WHEN 3 THEN @row ELSE @idXrow END
FROM
atable
CROSS JOIN
(SELECT @row := 0) AS p
ORDER BY
Pts DESC,
GD DESC
) AS s
WHERE
row BETWEEN @idXrow - 2 AND @idXrow + 2
;
关于php - 如何在 SQL 结果中搜索特定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20926197/