我正在尝试建立一个自动打印订单的系统,我现在面临一个问题。 我试图以打印机理解的格式创建一个字符串,现在,我需要在发送之前从数据库中收集数据。现在我的问题是在某些情况下order_id是相同的。这是一个例子:
+----------+----------------------+
| order_id | product_name |
+----------+----------------------+
| 1 | Pizza with cheese |
+----------+----------------------+
| 1 | Coca-Cola Zero |
+----------+----------------------+
| 2 | Spaghetti |
+----------+----------------------+
| 3 | Lasagna |
+----------+----------------------+
所以我想要的是将所有“product_name”收集在一个具有相同“order_id”的字符串中,因此它显示为: “芝士披萨,可口可乐零”
有没有办法做到这一点?
提前致谢。
编辑:我不知道我是否清楚地提到过它,但我想创建一个显示它的PHP脚本。对不起,如果我很困惑。
答案 0 :(得分:4)
您可以选择此
select order_id, count(*), group_concat(product_name)
from orders
group by order_id
having count(*) > 1;
这为您提供了所有order_id
个具有多个条目的条目数和连接在一起的订单。如果您不需要该号码,请忽略列列表中的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
}
这当然只是一个简短的概述。您必须添加错误处理并填写您想要对结果执行的操作。
答案 1 :(得分:2)
您可以使用
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>
答案 2 :(得分: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;
这样你就不会获得一个订单的多个orderIds
获得一个订单
select * from order where id=1
获取订单的所有产品
select op.* from order o inner join order_product op on op.orderId=o.id