【问题标题】:Remove repeating data in a column删除列中的重复数据
【发布时间】:2018-10-04 05:15:01
【问题描述】:

我目前正在开发一个订购系统,客户可以在其中订购许多商品。我还有一个管理员,他/她可以看到当天的所有订单。管理员可以查看客户的姓名、应付总额、产品和客户订购的产品数量。

我目前正在使用我的查询看到此结果。

 Name   | Payable | Product   | Quantity
 Test   |   165   | keychain  | 3
 Test   |   165   | Tumbler   | 1
 Miguel |   525   | Keychain  | 3
 Miguel |   525   | Magic Mug | 3
 Dandel |   1010  | keychain  | 3
 Dandel |   1010  | T-shirt   | 2
 Dandel |   1010  | Keychain  | 3
 Dandel |   1010  | Mug       | 5

这是我的查询。

 $result = mysql_query("
        SELECT reservation.firstname, reservation.lastname, reservation.payable, reservation.city, orders.product, orders.qty, reservation.date
        FROM orders
        INNER JOIN reservation
        ON orders.confirmation = reservation.confirmation 
        WHERE reservation.date = CURDATE() && reservation.city = '24th Floor'
        ");
    while($row = mysql_fetch_array($result))
        {
            echo '<tr>';
            echo '<td style="border: 1px solid black;">'.$row['firstname'].'</td>';
            echo '<td>'.$row['payable'].'</td>';
            echo '<td>'.$row['product'].'</td>';
            echo '<td>'.$row['qty'].'</td>';
            echo '</tr>';
        } 

我想得到这样的结果。我该怎么做?

 Name   | Payable | Product   | Quantity
 Test   |   165   | keychain  | 3
        |         | Tumbler   | 1
 Miguel |   525   | Keychain  | 3
        |         | Magic Mug | 3
 Dandel |   1010  | keychain  | 3
        |         | T-shirt   | 2
        |         | Keychain  | 3
        |         | Mug       | 5

【问题讨论】:

  • 不要使用 已弃用且不安全 mysql_*-functions。它们自 PHP 5.5(2013 年)以来已被弃用,并在 PHP 7(2015 年)中完全删除。请改用 MySQLi 或 PDO。
  • 如果有多个用户同名,会怎么样?你会如何区分它们?有用户ID吗?

标签: php mysql concatenation distinct


【解决方案1】:

您可以在迭代时维护一些状态,以跟踪当前行是否为新名称/应付账款:

$last_name_seen = NULL;

while ($row = mysql_fetch_array($result)) {
    $firstname = "";
    $payable = "";
    if ($last_name_seen === NULL || $row['firstname'] != $last_name_seen) {
        $last_name_seen = $row['firstname'];
        $firstname = $row['firstname'];
        $payable = $row['payable'];
    }
    echo '<tr>';
    echo '<td style="border: 1px solid black;">'.$firstname.'</td>';
    echo '<td>'.$payable.'</td>';
    echo '<td>'.$row['product'].'</td>';
    echo '<td>'.$row['qty'].'</td>';
    echo '</tr>';
}

请注意,您的 MySQL 查询应该有一些 ORDER BY 子句,以生成您想要的排序,例如

ORDER BY Name, Product;

正如上面的 cmets 所建议的,如果您使用的是已弃用的 PHP API,您应该考虑升级到更现代的东西。但是,上述循环中使用的逻辑不会随着 MySQL API 的更改而发生太大变化。

【讨论】:

  • 蒂姆爵士,这段代码就像一个魅力。谢谢你的帮助。但我还有一个问题。
  • @Benj 如果您有一个小的后续问题,请随时在评论中提问。如果这是一个全新的问题,请稍后再问。
  • @Tim 先生,问题现已发布。希望这次你能再次帮助我。谢谢!
  • @Tim 先生,我发布了一个新问题。希望这次你能再次帮助我。谢谢!
【解决方案2】:

您必须为名称和应付列设置标志并使用 array_column(),array_unique() 来获取唯一的列值:

<?php

$result = array(array("Name"=>"Test","Payable"=>'165',"Product"=>"keychain","Quantity"=>3),array("Name"=>"Test","Payable"=>'165',"Product"=>"Tumbler","Quantity"=>1));

$name_arr = array_unique(array_column($result, 'Name'));
$payable_arr = array_unique(array_column($result, 'Payable'));

$name_flag = 0;
$pay_flag = 0;

echo "<table border='1'>";

for($i=0;$i<count($name_arr);$i++)
{

    for($j=0;$j<count($payable_arr);$j++)
    {
        foreach($result as $list)
        {
            if($list['Name'] == $name_arr[$i] && $list['Payable'] == $payable_arr[$j])
            {
                if($name_flag==0 && $pay_flag==0)
                {
                    echo "<tr>";
                    echo "<td>".$name_arr[$i]."</td>";
                    echo "<td>".$payable_arr[$j]."</td>";
                    echo "<td>".$list['Product']."</td>";
                    echo "<td>".$list['Quantity']."</td>";
                    echo "</tr>";
                }
                else
                {
                    echo "<tr>";
                    echo "<td>&nbsp;</td>";
                    echo "<td>&nbsp;</td>";
                    echo "<td>".$list['Product']."</td>";
                    echo "<td>".$list['Quantity']."</td>";
                    echo "<tr>";
                }
                $name_flag++;
                $pay_flag++;
            }
        }
    }
    $name_flag=0;
    $pay_flag=0;
}
echo "</table>";
?> 

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2012-11-13
    • 1970-01-01
    • 2014-06-01
    • 2021-12-06
    相关资源
    最近更新 更多