1

放棄されたカートのデータベースを検索し、その内容 (製品名、画像、数量など) を顧客にメールで送信するスクリプトを作成しています。データは多くのテーブルに分散されており、情報を取得して電子メールで送信する限り、これまでのところ問題ありません。ただし、顧客がカートに入れた製品ごとに 1 つのメールを送信しています。したがって、カートに 5 つのアイテムがある場合、5 つのメールが送信されます。これは join と while ステートメントが原因であることはわかっていますが、私の php/sql の知識はあまりよくありません。

したがって、私の質問は、すべての製品を含む 1 人の顧客に 1 度だけ電子メールが送信されるように、どの join ステートメントまたは union ステートメントを使用する必要があるかということです。

結合について私が読んだチュートリアルには、すべてのテーブル間で共通の 1 つの ID またはキーが常にありますが、このストアのデータベース構造では、1 つのテーブルが 1 つのキーに基づいて別のテーブルに関連付けられ、そのテーブルは別のキーを使用して関連付けられます。もう一方の依存テーブル。

データベース構造は次のようになります。

ORDERS:
|   orderid    |   ordstatus   |   ordqty   |  ordcustid   |
|--------------|---------------|------------|--------------|
|    12637     |       0       |      1     |        0     |
|    12636     |      11       |      1     |     3531     |
|    12635     |      11       |      2     |     4192     |

ORDERPRODUCTS:
|  ordprodname  |  ordprodqty  |  orderorderid  |  orderprodid   |
|---------------|--------------|----------------|----------------|
|   product1    |      1       |      12637     |      1206      |
|   product2    |      1       |      12636     |       193      |
|   product3    |      1       |      12635     |      1712      |
|   product4    |      1       |      12635     |      1576      |

CUSTOMERS:
|  customerid  |  customeremail    |  firstname  |
|--------------|-------------------|-------------|
|     3531     | cust1@gmail.com   |  Customer1  |
|     4192     | cust2@gmail.com   |  Customer2  |

PRODUCTIMAGE:
|  imageid  |  imageprodid  |   imagethumb     |
|-----------|---------------|------------------|
| Product1  |      1206     | file/path/1.jpg  |
| Product2  |       193     | file/path/2.jpg  |
| Product3  |      1712     | file/path/3.jpg  |
| Product4  |      1576     | file/path/4.jpg  |

これまでのところ、私のスクリプトは次のようになります。

mysql_select_db("cartmail", $con);

$result = mysql_query("SELECT * 
            FROM    orders
                ,   orderproducts
                ,   productimage
                ,   customers
            WHERE   orders.orderid              = orderproducts.orderorderid
            AND     orderproducts.orderprodid   = productimage.imageprodid
            AND     orders.ordcustid            = customers.customerid
            AND     ordstatus = '11'
            LIMIT 0 , 30");

while($row = mysql_fetch_array($result))
{
    <My PHP mail script...>
}

mysql_close($con);
4

1 に答える 1

1

次のクエリは、MySQL で GROUP_CONCAT を使用して、注文の製品詳細を連結し、顧客ごとに 1 つの列の値を提供します。結果セットには、一意の顧客 ID、顧客名、顧客の電子メール、および注文の詳細の連結リストが含まれます。顧客に送信される電子メール本文で、連結された注文情報を使用するアイデアが得られることを願っています。

私は PHP を知りませんが、クエリは結果を取得する方法についてのアイデアを提供するはずです。

ここをクリックして、SQL フィドルのデモを表示します。

スクリプト:

CREATE TABLE orders
(
    orderid INT NOT NULL
  , orderstatus INT NOT NULL
  , ordqty INT NOT NULL
  , ordcustid INT NOT NULL
);

CREATE TABLE orderproducts
(
    ordprodname     VARCHAR(30) NOT NULL
  , ordprodqty      INT         NOT NULL
  , orderorderid    INT         NOT NULL
  , orderprodid     INT         NOT NULL
);

CREATE TABLE customers
(
    customerid      INT         NOT NULL
  , customeremail   VARCHAR(30) NOT NULL
  , firstname       VARCHAR(30) NOT NULL
);

CREATE TABLE productimage
(
    imageid         VARCHAR(30)     NOT NULL
  , imageprodid     INT             NOT NULL
  , imagethumb      VARCHAR(30)     NOT NULL
);

INSERT INTO orders (orderid, orderstatus, ordqty, ordcustid) VALUES
   (12637, 0,   1, 0),
   (12636, 11,  1, 3531),
   (12635, 11,  2, 4192);

INSERT INTO orderproducts (ordprodname, ordprodqty, 
            orderorderid, orderprodid) VALUES
   ('product1', 1, 12637, 1206),
   ('product2', 1, 12636, 193),
   ('product3', 1, 12635, 1712),
   ('product4', 1, 12635, 1576);

INSERT INTO customers (customerid, customeremail, firstname) VALUES
   (3531, 'cust1@gmail.com', 'Customer1'),
   (4192, 'cust2@gmail.com', 'Customer2'),
   (1111, 'cust3@gmail.com', 'Customer3');

INSERT INTO productimage (imageid, imageprodid, imagethumb) VALUES
   ('Product1', 1206,   'file/path/1.jpg'),
   ('Product2', 193,    'file/path/2.jpg'),
   ('Product3', 1712,   'file/path/3.jpg'),
   ('Product4', 1576,   'file/path/4.jpg');

SELECT          c.customerid
            ,   c.firstname
            ,   c.customeremail,
                group_concat('Order Id: ', orderid, 
                    ' | Product name: ', ordprodname, 
                    ' | Quantity: ', ordprodqty, '<br>') AS ordered_items,
FROM            customers c
LEFT OUTER JOIN orders o
ON              o.ordcustid = c.customerid
LEFT OUTER JOIN orderproducts op
ON              op.orderorderid = o.orderid
LEFT OUTER JOIN productimage pi
ON              pi.imageprodid = op.orderprodid
GROUP BY        c.customerid
HAVING          COUNT(DISTINCT o.ordcustid) > 0;

出力:

CUSTOMERID FIRSTNAME   CUSTOMEREMAIL     ORDERED_ITEMS
---------- ----------- ----------------  ------------------------------------
3531       Customer1   cust1@gmail.com   Order Id: 12636 | Product name: product2 | Quantity: 1<br>
4192       Customer2   cust2@gmail.com   Order Id: 12635 | Product name: product4 | Quantity: 1<br>,
                                         Order Id: 12635 | Product name: product3 | Quantity: 1<br> 
于 2012-04-30T04:11:11.187 に答える