通过PHP运行2个Mysql查询
我试图运行下面的查询,我发现SET语句是SELECT查询的一个单独查询。我已经找到了一些与此相关的答案,但无法在我的代码中使用它们 在phpMyAdmin中一切都很好,但在这个PHP网页中却不行 如何运行这两个查询以获得结果通过PHP运行2个Mysql查询,php,variables,mysqli,Php,Variables,Mysqli,我试图运行下面的查询,我发现SET语句是SELECT查询的一个单独查询。我已经找到了一些与此相关的答案,但无法在我的代码中使用它们 在phpMyAdmin中一切都很好,但在这个PHP网页中却不行 如何运行这两个查询以获得结果 $queryRank = "SET @rnk=0; SET @rank=0; SET @curscore=0; SELECT rank FROM ( SELECT AA.*,BB.playerId, (@rnk:=@r
$queryRank = "SET @rnk=0; SET @rank=0; SET @curscore=0;
SELECT rank FROM
(
SELECT AA.*,BB.playerId,
(@rnk:=@rnk+1) rnk,
(@rank:=IF(@curscore=best3,@rank,@rnk)) rank,
(@curscore:=best3) newscore
FROM
(
SELECT * FROM
(SELECT COUNT(1) scorecount,best3
FROM leaderboard GROUP BY best3
) AAA
ORDER BY best3 DESC
) AA LEFT JOIN leaderboard BB USING (best3)) A
WHERE playerId='$memberID'";
$resultRank = mysqli_query($link, $queryRank);
if (mysqli_num_rows($resultRank) > 0) {
$rowRank = mysqli_fetch_array($resultRank);
echo "<p class='mt-2 statNumber'>".$rowRank['rank']."</p>";
} else {
echo "No events played";
}
这只是一个想法,但是如果您要生成一个简单的存储过程,那么您在PHP中的查询将更加简单,并且消除了对多个查询的明显需求
DROP PROCEDURE IF EXISTS `spGetRank`;
delimiter //
create procedure `spGetRank`(
IN `p_player_id` VARCHAR(64)
)
begin
declare _player_id integer default 0;
set @_player_id=cast( p_player_id as unsigned );
set @rnk=0;
set @rank=0;
set @curscore=0;
select rank from
(
select aa.*, bb.playerid,
(@rnk:=@rnk+1) rnk,
(@rank:=if(@curscore=best3,@rank,@rnk)) rank,
(@curscore:=best3) newscore
from
(
select * from
(select count(1) scorecount, best3
from leaderboard group by best3
) aaa
order by best3 desc
) aa
left join leaderboard bb using (best3)) a
where playerid=@_player_id;
end//
delimiter ;
然后,在PHP中
$sql='call `spGetRank`(?)';
$stmt=$link->prepare( $sql );
if( $stmt ){
$stmt->bind_param('s', $memberID );
$res=$stmt->execute();
if( $res ){
$stmt->store_result();
$stmt->bind_result( $rank );
$stmt->fetch();
$stmt->close();
echo 'Rank:' . $rank;
}
}
另一种可能是在实际查询本身中定义变量,而不是将其作为单独的查询来定义——尽管说实话,上面的查询相当复杂。但总体要点如下:
select ... (@rnk := ifnull( @rnk, 0 ) + 1 ) etc
这只是一个想法,但是如果您要生成一个简单的存储过程,那么您在PHP中的查询将更加简单,并且消除了对多个查询的明显需求
DROP PROCEDURE IF EXISTS `spGetRank`;
delimiter //
create procedure `spGetRank`(
IN `p_player_id` VARCHAR(64)
)
begin
declare _player_id integer default 0;
set @_player_id=cast( p_player_id as unsigned );
set @rnk=0;
set @rank=0;
set @curscore=0;
select rank from
(
select aa.*, bb.playerid,
(@rnk:=@rnk+1) rnk,
(@rank:=if(@curscore=best3,@rank,@rnk)) rank,
(@curscore:=best3) newscore
from
(
select * from
(select count(1) scorecount, best3
from leaderboard group by best3
) aaa
order by best3 desc
) aa
left join leaderboard bb using (best3)) a
where playerid=@_player_id;
end//
delimiter ;
然后,在PHP中
$sql='call `spGetRank`(?)';
$stmt=$link->prepare( $sql );
if( $stmt ){
$stmt->bind_param('s', $memberID );
$res=$stmt->execute();
if( $res ){
$stmt->store_result();
$stmt->bind_result( $rank );
$stmt->fetch();
$stmt->close();
echo 'Rank:' . $rank;
}
}
另一种可能是在实际查询本身中定义变量,而不是将其作为单独的查询来定义——尽管说实话,上面的查询相当复杂。但总体要点如下:
select ... (@rnk := ifnull( @rnk, 0 ) + 1 ) etc
使用mysqli_查询,一次调用只能运行一个查询。还有一个@KIKOSoftware供您参考,这个函数是一个复杂而危险的工具,使用起来非常复杂。因此,默认情况下不建议使用该选项。更不用说mysqli_query和mysqli_multi_query都不应该与查询中的php变量一起使用。我建议您创建一个存储过程来实现您的目标,这样就不需要在php代码中进行多个查询,只需要一个简单的调用proc类型query。使用mysqli_query,您只能在一个调用中运行一个查询。还有一个@KIKOSoftware供您参考,这个函数是一个复杂而危险的工具,使用起来非常复杂。因此,默认情况下不建议使用该选项。更不用说mysqli_query和mysqli_multi_query都不应该与查询中的php变量一起使用。我建议您创建一个存储过程来实现您的目标,这样就不需要在php代码中进行多次查询,只留下一个简单的调用过程类型query存储过程看起来是一个很好的解决方法,我已经尝试过使用,但是只要保持等级为“0”,mysql db就会对变量做一些奇怪的事情。在运行上述操作之前,请尝试在mysql客户端应用程序gui或cmdline中将这些变量设置为null。然后尝试从gui或cmd运行存储过程。上面的代码没有经过测试,但本质上与您最初使用的代码完全相同-遗憾的是,我没有办法进行测试。我尝试在phpMyAdmin中运行该过程,请求参数,但仍然给出0。请原谅,我完全不知道以下内容,但传入的memberID变量是一个介于1和30之间的数字,这与任何变量声明有什么区别吗?您可以随时修改它以匹配其他整数-我只是在varcharOK猜测-为最初给出的错误过程道歉。我根据我在原始查询中可以确定的列模拟了一个简单的表,并对上面的存储过程进行了一些修改-现在似乎可以工作了??存储过程看起来是一个很好的解决方法,我尝试过使用它,但只要保持“0”的秩,mysql db就会对变量做一些奇怪的事情。在运行上述操作之前,请尝试在mysql客户端应用程序gui或cmdline中将这些变量设置为null。然后尝试从gui或cmd运行存储过程。上面的代码没有经过测试,但本质上与您最初使用的代码完全相同-遗憾的是,我没有办法进行测试。我尝试在phpMyAdmin中运行该过程,请求参数,但仍然给出0。请原谅,我完全不知道以下内容,但传入的memberID变量是一个介于1和30之间的数字,这与任何变量声明有什么区别吗?您可以随时修改它以匹配其他整数-我只是在varcharOK猜测-为最初给出的错误过程道歉。我根据我在原始查询中可以确定的列模拟了一个简单的表,并对上面的存储过程进行了一些修改-现在似乎可以工作了??