在PHP中显示具有相同id的行的值

时间:2012-11-17 20:05:54

标签: php mysql string

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

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

所以我想要的是将所有“product_name”收集在一个具有相同“order_id”的字符串中,因此它显示为: “芝士披萨,可口可乐零”

有没有办法做到这一点?

提前致谢。

编辑:我不知道我是否清楚地提到过它,但我想创建一个显示它的PHP脚本。对不起,如果我很困惑。

3 个答案:

答案 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