亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

@row:=@row+1 的 php 等價物是什么

@row:=@row+1 的 php 等價物是什么

PHP
一只萌萌小番薯 2022-07-22 10:26:57
我有一個在數據庫操場MySQL上成功運行的語句。SQL它查詢并返回我的 location_values 表中的每 10 行,而不管 ID 中的任何間隙。它看起來像這樣:MySQLset @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我有一個在數據庫操場MySQL上成功運行的語句。SQL它查詢并返回我的 location_values 表中的每 10 行,而不管 ID 中的任何間隙。它看起來像這樣:MySQLset @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 中的空白,我將不勝感激。
查看完整描述

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 中的空白,我將不勝感激。


查看完整回答
反對 回復 2022-07-22
?
開滿天機

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


查看完整回答
反對 回復 2022-07-22
  • 2 回答
  • 0 關注
  • 216 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號