2012-04-30 17 views
1

我正在创建一个脚本,用于在数据库中搜索废弃的购物车,并将这些内容通过电子邮件发送给客户(产品名称,图像,数量等)。数据分布在多个表格中,并且尽可能地获取信息并通过电子邮件发送 - 迄今为止非常好。但是,它会发送一个电子邮件,每个产品,客户已放入购物车。所以如果他们的购物车中有5件商品,它会发送5封电子邮件。我知道这是因为我的加入和声明,但我的PHP/SQL知识不是很好。我应该使用哪个联合,联合或选择来处理多个表中的数据?

所以我的问题是我应该使用哪种联合或联合声明,以便电子邮件只发送给一位客户,其中包含他们所有的产品。

我读过关于联接的教程总是有一个id或者所有表之间通用的键,但是这个存储的数据库结构中的一个表与另一个基于off的键相关,然后该表使用不同的键与另一个依赖表相关。

数据库结构看起来像这样。

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  | [email protected] | Customer1 | 
|  4192  | [email protected] | 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); 
+0

为什么你需要的产品,在结果集?它是建立电子邮件吗? –

+2

我不认为你对查询有任何问题,以至于你如何使用它。如果您通过customerid订购查询,那么当您准备电子邮件时,您会遍历整套电子表格,并在每次客户更改时创建一封新电子邮件,并随时将相关数据放入电子邮件中。 – Quaternion

+0

是的,我想在电子邮件中显示产品名称和产品图片,以提醒客户他们放弃了什么。 – James

回答

1

下面的查询使用GROUP_CONCAT在MySQL来连接顺序的产品细节和为每个客户提供单独列的值。结果集包含唯一的客户ID,客户名称,客户电子邮件以及其订单详细信息的连接列表。希望这给你一个想法,使用电子邮件正文中的连接订单信息,将发送给客户。

我不知道PHP,但查询应该给你一个关于如何获取结果的想法。

Click here to view the demo in SQL fiddle.

脚本

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, '[email protected]', 'Customer1'), 
    (4192, '[email protected]', 'Customer2'), 
    (1111, '[email protected]', '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 [email protected] Order Id: 12636 | Product name: product2 | Quantity: 1<br> 
4192  Customer2 [email protected] Order Id: 12635 | Product name: product4 | Quantity: 1<br>, 
             Order Id: 12635 | Product name: product3 | Quantity: 1<br>