2 回答
TA贡献1788条经验 获得超4个赞
我有一个在数据库操场MySQL上成功运行的语句。SQL它查询并返回我的 location_values 表中的每 10 行,而不管 ID 中的任何间隙。
它看起来像这样:
MySQL
set @row:=-1;
SELECT location_values.*
FROM
location_values
INNER JOIN
(
SELECT id
FROM
(
SELECT @row:=@row+1 AS rownum, id
FROM
(
SELECT id FROM location_values ORDER BY id
) AS sorted
) as ranked
WHERE rownum % 10 = 0
) AS subset
ON subset.id = location_values.id
工作 db-fiddle
问题:我想转换上面的这个语句并在PHP查询中运行它,但是我在这样做时遇到了问题。
按照目前的情况,我的自定义PHP函数继续打印整个表,而不是按照 MySQL 语句每 10 行打印一次。我怀疑是由于不解释set @row:=-1;而@row:=@row+1在PHP.
我的 PHP 函数
function get_incidents() {
$row = -1;
$query = query("
SELECT location_values.*
FROM
location_values
INNER JOIN
(
SELECT id
FROM
(
SELECT $row + 1 AS rownum, id
FROM
(
SELECT id FROM location_values ORDER BY id
) AS sorted
) as ranked
WHERE rownum % 10 = 0
) AS subset
ON subset.id = location_values.id");
confirm($query); //passes in the global $connection;
while ($row = fetch_array($query)) {
$incidents = <<<DELIMETER
<tr>
<td>{$row['id']}</td>
<td>{$row['name']}</td>
<td>{$row['lat']}</td>
<td>{$row['lng']}</td>
</tr>
DELIMETER;
echo $incidents;
} // end of while loop
} // end of function
我对 PHP 很陌生,对于如何最好地重构我的 PHP 函数以实现我的目标,即返回每 10 行而不考虑 ID 中的空白,我将不胜感激。
TA贡献1786条经验 获得超13个赞
MySQL >8.0
您可以使用窗口函数来完成相同的任务。如果我没记错的话,正确的做法如下:
SELECT t.* FROM (SELECT *, Row_number() OVER() AS rn FROM location_values) t
WHERE t.rn % 10 = 1
https://www.db-fiddle.com/f/tb2nLZ6dkDPaQxkc6My9Yg/2
MySQL <8.0
您可以使用会话属性模拟窗口函数,但这并不总是可靠的。
方法一(只能执行一次,不推荐):
SELECT t.*
FROM
(SELECT *, @position:=((SELECT ifnull(@position, 0)) + 1) AS rn FROM location_values) t
WHERE t.rn % 10 = 1
方法二:
SELECT location_values.*
FROM location_values,
(SELECT @row_number:=0) AS temp
WHERE (@row_number:=@row_number + 1) % 10 = 1
https://www.db-fiddle.com/f/tb2nLZ6dkDPaQxkc6My9Yg/3
- 2 回答
- 0 关注
- 241 浏览
添加回答
举报
