我应该使用哪个join,union或select来处理多个表中的数据?

时间:2012-04-30 01:38:04

标签: php mysql sql

我正在创建一个脚本,在数据库中搜索废弃的购物车并将内容通过电子邮件发送给客户(产品名称,图像,数量等)。数据分布在许多表格中,只要获取信息并通过电子邮件发送 - 迄今为止一切顺利。但是,它会按照客户放入购物车的每件商品发送一封电子邮件。因此,如果他们的购物车中有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);

1 个答案:

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