在PHP中使用mysqli创建子查询,以升序获取数组的最后10个结果


Creating a subquery with mysqli in PHP to fetch array last 10 results in ascending order

我认为这将是简单的,但我有一个艰难的时间弄清楚为什么这不会填充数据数组。

这个简单的查询工作得很好:

$queryPrice = "SELECT price FROM price_chart ORDER BY id ASC LIMIT 50";
$resultPrice = mysqli_query($conn, $queryPrice);
$data = array();
while ($row = mysqli_fetch_array($resultPrice)) {
$data[] = $row[0];
}

但是我希望它以升序选择最后10个结果。我发现在其他SO问题上使用子查询,但我尝试的每个例子都没有输出也没有错误??

试了下面的,不成功:

$queryPrice = "SELECT * FROM (SELECT price FROM price_chart ORDER BY id DESC LIMIT 10) ORDER BY id ASC";
$resultPrice = mysqli_query($conn, $queryPrice);
$data = array();
while ($row = mysqli_fetch_array($resultPrice)) {
$data[] = $row[0];
}  

我还尝试再次指定表名并使用IN,也不起作用:

$queryPrice = "SELECT price FROM price_chart IN (SELECT price FROM price_chart ORDER BY id DESC LIMIT 10) ORDER BY id";
$resultPrice = mysqli_query($conn, $queryPrice);
$data = array();
while ($row = mysqli_fetch_array($resultPrice)) {
$data[] = $row[0];
}  

在这两个例子中,我的数组是空白的,而不是返回最后10个结果,没有错误,所以我必须做子查询错误,它返回0行。

子查询没有选择id列,因此您不能在外部查询中按它排序。另外,当你在FROMJOIN子句中使用子查询时,MySQL要求你分配一个别名。

$queryPrice = "SELECT * 
                FROM (SELECT id, price 
                        FROM price_chart 
                        ORDER BY id DESC LIMIT 10
                ) x ORDER BY id ASC";
$resultPrice = mysqli_query($conn, $queryPrice) or die (mysqli_error($conn));
$data = array();
while ($row = mysqli_fetch_assoc($resultPrice)) {
    $data[] = $row['price'];
}  

如果在查询失败时调用mysqli_error(),则会收到这些错误的通知。

第二个查询最接近。但是,您需要一个表别名。(如果您正在踢出sql中的错误,就会看到这种情况。注意,您需要在子查询中添加希望排序的任何字段。在本例中是id

试试这个:

SELECT * FROM (SELECT price, id 
FROM price_chart ORDER BY id DESC LIMIT 10) as prices 
ORDER BY id ASC

你一定有错误,因为你的SQL查询实际上是不正确的。

首先,如何告诉你有错误:

$resultPrice = mysqli_query (whatever);
if ( !$resultprice ) echo mysqli_error($conn);
第二:MySQL中的子查询需要别名。所以你需要这个:
SELECT * FROM (
       SELECT id, price
         FROM price_chart
        ORDER BY id DESC LIMIT 10
       ) AS a
ORDER BY id ASC";

参见) AS a ?这是表别名