通过匹配id

时间:2018-01-23 10:11:39

标签: php mysql

我试图按订单ID对用户订单进行分组,但是我没有做对,我知道这将首先在SQL查询中完成,然后在PHPHTML中很好地组织它不知道如何完成它。

订单信息

oid  | userid  | total  | payid
-----|---------|--------|----------
oi10 | peter   | 650    | VCC-100
oi12 | john    | 30     | VCC-500
oi15 | peter   | 60     | COD-500

itemorder

pid | ioid  | userid  | price  | qty | itemname
----| ------|---------|--------|-----|-----------
p10 | oi10  | peter   | 200    | 1   | lexus
p20 | oi10  | peter   | 150    | 1   | Toyota
p15 | oi10  | peter   | 300    | 1   | Myvi
p66 | oi15  | peter   | 25     | 2   | BMW
p67 | oi15  | peter   | 10     | 1   | Saga
p67 | oi12  | john    | 10     | 3   | Saga

我当前的代码

$handler->prepare('
    SELECT * FROM itemorder io
    LEFT JOIN orderinfo oi
    ON io.oid = oi.ioid
    WHERE io.userid = 'peter' 
    GROUP BY io.oid
    ORDER BY oi.pid DESC
');
$handler->execute();
$RecentOrder = $handler->getAll();
$handler->free();
    if(!empty($RecentOrder)){
        foreach($RecentOrder as $row){

        }
    }

预期结果

我希望根据order id对所有具有相同订单ID的项目进行排序(根据订单ID列出)。

oid: oi10
  --------
    lexus
    Toyota
    Myvi
---------------------
oid: oi15 
   --------
    BMW
    Saga

2 个答案:

答案 0 :(得分:1)

只需ORDER BY即可检索所需的输出。

SELECT *
...
ORDER BY oi.oid DESC, io.pid DESC

然后在PHP中执行特定的格式化。最简单的方法可能是记住最后一行的order_id。

$lastOrderId = null;
foreach ($result as $row) {
    if ($lastOrderId != $row['oid']) {
        echo 'oid: ' . $row['oid'] . PHP_EOL;
        echo '  -----------' . PHP_EOL;
    }
    echo '     ' . $row['itemname'] . PHP_EOL;

    $lastOrderId = $row['oid'];
}

答案 1 :(得分:0)

你可以试试这个:

SELECT io.ioid,GROUP_CONCAT("",io.itemname) as order_items FROM itemorder as io
        LEFT JOIN orderinfo as oi
        ON io.ioid = oi.oid
        WHERE io.userid = 'peter' 
        GROUP BY io.ioid
    ORDER BY io.pid DESC

请注意不要加入的列。

然后在PHP中,您可以使用explode函数获取每个订单的名称数组。

希望这有帮助!