精确SQL查询使用MySQL命令行和PHP PDO返回不同的数据

精确SQL查询使用MySQL命令行和PHP PDO返回不同的数据,php,mysql,pdo,Php,Mysql,Pdo,我有一个查询,从数据库返回最近10条新闻和最近10条评论 SQL: PHP: 该查询在MySQL cmd中运行良好,但在PHP中返回错误的数据。问题在rnk行。它总是等于1。为什么呢 更新:我刚刚重新启动了MySQL命令行,结果收支平衡。但后来我用SET profiling=1打开了profiling,突然它又开始工作了。更重要的是,关闭分析功能并不会否定这种效果。事实证明,问题在于用户定义的变量初始化。我们应该明确地这样做,以避免未定义的行为。 在我们的案例中,我们又添加了一个连接: FR

我有一个查询,从数据库返回最近10条新闻和最近10条评论

SQL:

PHP:

该查询在MySQL cmd中运行良好,但在PHP中返回错误的数据。问题在rnk行。它总是等于1。为什么呢


更新:我刚刚重新启动了MySQL命令行,结果收支平衡。但后来我用SET profiling=1打开了profiling,突然它又开始工作了。更重要的是,关闭分析功能并不会否定这种效果。

事实证明,问题在于用户定义的变量初始化。我们应该明确地这样做,以避免未定义的行为。 在我们的案例中,我们又添加了一个连接:

FROM (SELECT * FROM news WHERE type_id=5 ORDER BY news_id DESC LIMIT 10) lastnews
  LEFT OUTER JOIN comments cmts ON cmts.news_id=lastnews.news_id
  INNER JOIN (SELECT @rnk:=0,@prev_news_id:=0) t3

这是一个愚蠢的问题,但你确定你在看数组的值而不是它的索引吗?我100%肯定。它返回rnk=1的所有注释。不管我在哪里设置了什么,rnk
$query = <<<_END
SELECT news_id, comment_id, rnk
FROM (
  SELECT
    *,
    @rnk:=IF(@prev_news_id=news_id, @rnk+1, 1) rnk,
    @prev_news_id:=news_id
  FROM (
    SELECT
      lastnews.*,
      cmts.comment_id,
      cmts.message,
      cmts.msg_time
    FROM (SELECT * FROM news WHERE type_id=5 ORDER BY news_id DESC LIMIT 10) lastnews
      LEFT OUTER JOIN comments cmts ON cmts.news_id=lastnews.news_id
    ORDER BY cmts.news_id DESC, cmts.comment_id DESC) t1) t2
WHERE rnk <= 10;
_END;

$db = new PDO('mysql:='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
$dbh = $db->prepare($query);
$dbh->execute();
$data = $dbh->fetchAll(PDO::FETCH_NUM|PDO::FETCH_GROUP);
print_r($data);
FROM (SELECT * FROM news WHERE type_id=5 ORDER BY news_id DESC LIMIT 10) lastnews
  LEFT OUTER JOIN comments cmts ON cmts.news_id=lastnews.news_id
  INNER JOIN (SELECT @rnk:=0,@prev_news_id:=0) t3