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 關注
- 216 瀏覽
添加回答
舉報