用php在语句获取中识别mysql更改的“groupby”字段值的最佳方法?

用php在语句获取中识别mysql更改的“groupby”字段值的最佳方法?,php,mysql,group-by,Php,Mysql,Group By,我的php中有一个sql查询: $sql = "SELECT * FROM orderTaken WHERE orderStatus='10' GROUP BY orderId ORDER BY orderTakenTime DESC"; 现在,我必须基于不同的orderId回显几个HTML表,因此基本上如果orderId被更改,将创建一个新的HTML表,并包含该orderId下所有内容的信息。这是我做的一个伪代码,请忽略语法错误。我真正的代码要复杂得多,但思想是:设置一个oldOrderId

我的php中有一个sql查询:

$sql = "SELECT * FROM orderTaken WHERE orderStatus='10' GROUP BY orderId ORDER BY orderTakenTime DESC";
现在,我必须基于不同的orderId回显几个HTML表,因此基本上如果orderId被更改,将创建一个新的HTML表,并包含该orderId下所有内容的信息。这是我做的一个伪代码,请忽略语法错误。我真正的代码要复杂得多,但思想是:设置一个oldOrderId,并用新获取的orderId检查它,看看orderId是否发生了更改:

$sql = "SELECT * FROM orderTaken WHERE orderStatus='10' GROUP BY orderId ORDER BY orderTakenTime DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$count = $stmt->rowCount();
for ($i = 0; $i<$count + 1; $i++ ){
    if ($row = $stmt->fetch()){
        $orderId = $row["orderId"];
        $2ndField = $row["2ndField"];
        $3rdField = $row["3rdField"];
        ...
        // check if $oldOrderId is set
        if (isset($oldOrderId)){
            // and compare, if the orderId changes, end the table and create a new one
            if ($oldOrderId != $orderId){
                echo "</table><br>";
                echo "<table><tr><th>...</th></tr>";
                ...
                //UPDATE old orderId
                $oldOrderId = $orderId;
            // if orderId doesn't change, continue echo table content
            } else {
                echo "<table><tr><td>...</td></tr>";
            }
        // if the oldOrderId is not set, it means this is the first fetched row, and the very first table will be created
        } else {
            echo "<table><tr><th>...</th></tr>";
            ...
            echo "<table><tr><td>...</td></tr>";
            ...
            //SET oldOrderId
            $oldOrderId = $orderId;
        }
    }
    if ($i == $count) {
        //End the last table
        echo "</table><br>";
    }
}
代码可以运行,但有时会出现错误,我认为这不是一种明智的识别方法。有没有类似的方法 $row=$stmt->fetch.prev 要获取最后一行的orderId值?或者有没有更好的方法


谢谢

问题在于查询中是否包含GROUP BY orderId。这样做的目的是为表中的每个orderId提供一行

因为您使用的是SELECT*,所以返回的只是每个orderId的一行,以及表中其他每个字段的一个值

使用GROUPBY时,通常需要向查询中添加一个GROUP函数,如SUM、COUNT、GROUP_CONCAT等

使用$oldOrderId的方法很好,如果您将查询更改为以下内容,则可以使用该方法:

SELECT * FROM orderTaken
WHERE orderStatus='10'
ORDER BY orderID DESC, orderTakenTime DESC

为什么有时候会有马车?我也不明白。。。有时我回显的表是错误的,或者表中应该包含的某些信息丢失了。原因应该是我自己的代码在这些块中的逻辑是错误的。但我只是想问,是否有更好的方法来检查这个值是否发生了变化,因此它可能也会帮助我编写正确的回显表逻辑:如果您在查询中使用GROUP BY,那么您可能需要在SELECT中使用某种GROUP函数,如SUM、COUNT、GROUP_CONCAT等。。当您添加GROUP BY orderId时,每个orderId的结果将有一行,使用SELECT*,其他字段将获得的所有值都是表中众多值中的一个。您存储和检查$oldOrderId只在没有按orderId分组的情况下有效。@RocketHazmat在我感谢您的回答后,我正准备感谢您的评论,然后才意识到您就是回答我问题的那个人哈哈!再次感谢,我一定会了解更多关于这些团体的功能。赞成!谢谢火箭!哇,你绝对是对的,我误解了分组是如何工作的。我原以为可以按照相同的orderId逐个对条目进行分组,但我只是在phpmyadmin中检查了我的查询,正如您所说的,它每行只给我一个条目,而不是逐个。。。您的代码正是我希望使用原始$oldOrderId方法获得性能的代码。他们现在工作了!非常感谢。从你那里学到很高兴我能帮忙:-