【问题标题】:Find MIN -values but maintain row values in PHP mysqli查找 MIN -values 但在 PHP mysqli 中维护行值
【发布时间】:2016-07-06 06:30:38
【问题描述】:

我有一个包含 32 行的表,两行包含相同的“名称值”,但具有不同的树莓值(分别为“一”和“二”。)

我想提取具有唯一名称和最低平均距离的每一行 - 给我 16 行,为此我使用此查询:

SelectFinally();

function SelectFinally (){
    $con = connectToDB();
     $sql = "SELECT name,MIN(average_distance),raspberry From average GROUP BY name";
    $result= mysqli_query($con,$sql);
   $num_rows = mysqli_num_rows($result);

   echo "number of rows"  .$num_rows ."<br />";
        while($row=mysqli_fetch_assoc($result))  {
        extract($row);
        $name = $row['name'];       
       $distance = $row['MIN(average_distance)'];    //."<br />";
       $raspberry = $row['raspberry'];       //."<br />";

echo "select inside selectFinally     name: " .$name  ."    distance:  " .$distance  ."  raspberry    "   .$raspberry ."<br />"; 


    }

}

这个查询给了我平均距离的最低值,但是它弄乱了我的覆盆子值。例如blå_bil 的覆盆子值应该是“二”,因此它的平均距离值最低。 我似乎无法做到这一点。有人可以帮我做对吗?

【问题讨论】:

    标签: php mysql min


    【解决方案1】:

    尝试:

    SELECT a.name, a.raspberry
    FROM   average a
    INNER JOIN
    (
        SELECT   name, MIN(average_distance) as avg_dist
        FROM     average
        GROUP BY name
    ) a2 ON a.name = a2.name AND a.average_distance = a2.avg_dist
    

    而不是SELECT name,MIN(average_distance),raspberry From average GROUP BY name

    【讨论】:

    • 如果任何一对同名的行也有相同的average_distance,这个查询将返回这两行。这可能是也可能不是所需的行为。
    • 确实如此。我在下表中对其进行了测试:CREATE TABLE average(name VARCHAR(32), average_distance INT, raspberry VARCHAR(4)); INSERT INTO average VALUES('a', 7, 'one'), ('a', 7, 'two'), ('b', 2, 'one'), ('b', 4, 'two'); 并返回了两行名称为“a”。
    • 好的,我现在明白你的意思了......我想 OP 不会费太多汗来修改查询并在这种情况下添加他自己的逻辑
    • 嗨 Matha 当我从方法中提取数据时,我得到了名称和树莓派——但不是平均距离——那么这条线是否正确? $distance = $row['MIN(average_distance)'];
    • 不,它应该是 $distance = $row['avg_dist'];,请参阅我的 Inner Join 查询。如果您想保留它,我将使用别名 MIN(average_distance) as avg_dist `$distance = $row['MIN(average_distance)' ];` 那么你的内部查询不应该使用别名它应该只是MIN(average_distance)
    【解决方案2】:

    感谢 Nishant Matha 它奏效了——我只需要在我的第一个选择中添加 te raspberry。现在它将平均距离添加到输出中。

        $sql = "SELECT a.name, a.average_distance, a.raspberry 
    from average a 
    INNER JOIN
    (
    select name,MIN(average_distance) AS avg_dist,raspberry
    FROM average
    GROUP BY name
    )
    a2 ON a.name=a2.name AND a.average_distance = a2.avg_dist ";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 2014-12-13
      • 1970-01-01
      • 2012-02-24
      • 2018-12-02
      • 2011-01-07
      相关资源
      最近更新 更多