我正在创建一个脚本,在数据库中搜索废弃的购物车并将内容通过电子邮件发送给客户(产品名称,图像,数量等)。数据分布在许多表格中,只要获取信息并通过电子邮件发送 - 迄今为止一切顺利。但是,它会按照客户放入购物车的每件商品发送一封电子邮件。因此,如果他们的购物车中有5件商品,则会发送5封电子邮件。我知道这是因为我的join和while语句,但我的php / sql知识不是很好。
所以我的问题是我应该使用哪个加入或联合声明,以便只向一个包含所有产品的客户发送一次电子邮件。
我读过的关于Joins的教程总是有1个id或密钥在所有表之间是通用的,但是对于这个商店的数据库结构,一个表与另一个基于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);
答案 0 :(得分:1)
以下查询使用MySQL中的GROUP_CONCAT来连接订单中的产品详细信息,并为每个客户提供单列值。结果集包含唯一的客户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, '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>