4

注文を自動的に印刷するシステムを作ろうとしていますが、現在問題に直面しています。プリンターが理解できる形式で文字列を作成しようとしていますが、現在、送信する前にデータベースからデータを収集する必要があります。今私の問題は、場合によっては order_id が同じであることです。以下に例を示します。

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

だから私がしようとしているのは、同じ「order_id」を持つすべての「product_name」を1つの文字列に集めて、「チーズ入りピザ、コカコーラゼロ」と表示することです。

それを行う方法はありますか?

前もって感謝します。

編集:上記で明確に言及したかどうかはわかりませんが、それを表示するPHPスクリプトを作成したいと思います。混乱している場合は申し訳ありません。

4

3 に答える 3

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
}

もちろん、これは簡単な概要にすぎません。エラー処理を追加し、結果で何をしたいかを入力する必要があります。

于 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 つの注文に複数の製品を含めることができる関連1:Nがあるため、データを 2 つの別個のテーブルに分割する必要があります。

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;  

そうすれば、1 つの注文に対して複数の orderId を取得することはありません

1件の注文を受ける

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 に答える