4

我正在尝试制作一个自动打印订单的系统,但我现在面临一个问题。我正在尝试以打印机可以理解的格式制作字符串,现在,我需要在发送之前从数据库中收集数据。现在我的问题是,在某些情况下 order_id 是相同的。这是一个例子:

+----------+----------------------+
| order_id |     product_name     |
+----------+----------------------+
|     1    |   Pizza with cheese  |
+----------+----------------------+
|     1    |    Coca-Cola Zero    |
+----------+----------------------+
|     2    |       Spaghetti      |
+----------+----------------------+
|     3    |        Lasagna       |
+----------+----------------------+

所以我想要将所有“product_name”收集在一个字符串中,它们具有相同的“order_id”,所以它显示为:“Pizza with cheese, Coca-Cola Zero”

有没有办法做到这一点?

提前致谢。

编辑:我不知道我上面是否清楚地提到它,但我想制作一个显示它的 PHP 脚本。对不起,如果我感到困惑。

4

3 回答 3

4

您可以为此选择

select order_id, count(*), group_concat(product_name)
from orders
group by order_id
having count(*) > 1;

这为您提供了order_id具有多个条目的所有 s,其中条目数和订单连接在一起。如果您不需要该数字,请忽略count(*)列列表中的。

如果您希望所有订单都省略having

select order_id, count(*), group_concat(product_name)
from orders
group by order_id

并使用 PHP

$conn = new mysqli($host, $user, $pass, $db);
// use the appropriate select
$result = $conn->query('select order_id, group_concat(product_name) '
                       . 'from orders group by order_id');
while ($row = $result->fetch_array()) {
    // process the result row
}

这当然只是一个简短的大纲。您必须添加错误处理并填写您想要对结果执行的操作。

于 2012-11-17T20:14:47.173 回答
3

你可以使用

SELECT order_id, GROUP_CONCAT(product_name SEPARATOR ', ') AS product_names FROM orders GROUP BY order_id;

PHP 中的示例:

<?php
    $db_server = 'localhost';
    $db_user = 'user';
    $db_pass = 'pass';
    $db_name = 'database';

    $con = mysql_connect($db_server, $db_user, $db_pass)
        or die('Could not connect to the server!');

    mysql_select_db($db_name)
        or die('Could not select a database.');


    $sql = "SELECT order_id, GROUP_CONCAT(product_name SEPARATOR ', ')";
    $sql .= " AS product_names FROM orders GROUP BY order_id";

    $result = mysql_query($sql)
        or die('A error occured: ' . mysql_error());
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
    <title>test</title>
</head>

<body>
<h1>orders</h1>
<table>
   <tr><th>orders_id</th><th>product_names</th></tr>
<?php
while ($row = mysql_fetch_assoc($result)) {
    printf("<tr><td>%d</td><td>%s</td></tr>\n", $row['order_id'],
                                                $row['product_names']);
}
?>
</table>
</body>
</html>
于 2012-11-17T20:25:44.370 回答
1

您应该将数据拆分到两个单独的表中,因为存在1:N关联,其中一个订单可以包含多个产品。

CREATE TABLE `order` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
   .... any further information about the order,
   PRIMARY_KEY(`id`)
);

CREATE TABLE `order_product` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` int(11) DEFAULT NULL,
  `product_name` int(11) DEFAULT NULL,
   PRIMARY KEY (`id`),
   CONSTRAINT `order_product_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `order` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;  

这样你就不会为一个订单获得多个 orderId

获得一份订单

select * from order where id=1

获取订单的所有产品

select op.* from order o inner join order_product op on op.orderId=o.id
于 2012-11-17T20:15:59.807 回答