我有一个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
working 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 = <<{$row['id']}{$row['name']}{$row['lat']}{$row['lng']}
DELIMETER;
echo $incidents;
} // end of while loop
} // end of function
我是PHP的新手,对于能最好地重构PHP函数以实现我的目标(无论ID的间隔如何)返回第10行的目标,我将不胜感激。
参考方案
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
您可以使用session属性来模拟window函数,但这并不总是可靠的。
方法1(只能执行一次;不推荐):
SELECT t.*
FROM
(SELECT *, @position:=((SELECT ifnull(@position, 0)) + 1) AS rn FROM location_values) t
WHERE t.rn % 10 = 1
方法2:
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
PHP mysqli获取查询返回的第一行的值 - php
我正在使用mysqli从数据库中获取某些数据。我正在使用的查询已设置为仅从数据库返回一行。有没有一种方法可以在不使用while循环的情况下获取该行的值?我知道一个while循环对于返回多于一行的行很有用,但是如果不需要while循环,我想避免这种情况,因为不必要的代码是不好的编程。 参考方案 是的-您可以使用:$row = $result->fetch…是否可以在PHP中检索有关MySQL资源的详细信息? - php
我正在处理使用MySQL资源(public $_conn)的(PHP5)类。当我执行print_r($this->-conn)时,会看到诸如资源ID#30的文本。是否可以获取该特定资源的连接详细信息?我必须至少获得MySQL用户名? 参考方案 您应该在文件中的某个位置使用用户名,以便您可以创建连接资源。但是您可以使用以下SQL命令获取当前用户:SELE…正则表达式,用于验证以+254开头的电话号码 - php
我正在尝试创建一个正则表达式以匹配以+254开头的电话号码电话号码示例 +254716370730+254856798768 +254765432135 我努力了preg_match('/^\\+254\\d{9}/,$phonenumber'); 但似乎无效,我们将不胜感激任何帮助 参考方案 正确的语法应为:preg_match(…如何在return语句中编写循环? - php
我需要得到这个结果return [ [$row_0['Наименование'], $row_0['Ассортимент'], $row_0['Сумма']], [$row_1['Наименование'], $row_1['Ассортимент']…从Codeigniter中的联接显示数据 - php
我正在使用一个简单的联接从两个数据库中提取数据。这是模型中的联接:function com_control(){ $this->db->select('*'); $this->db->from('comments'); $this->db->join('posts'…