php - 我应该使用哪个连接、联合或选择来处理多个表中的数据?

标签 php mysql sql

我正在创建一个脚本,用于在数据库中搜索废弃的购物车并将内容通过电子邮件发送给客户(产品名称、图片、数量等)。数据分布在多个表格中,并且就获取信息和通过电子邮件发送信息而言 - 到目前为止一切顺利。但是,它会为客户放入购物车的每个产品发送一封电子邮件。因此,如果他们的购物车中有 5 件商品,它会发送 5 封电子邮件。我知道这是因为我的 join 和 while 语句,但我的 php/sql 知识不是很好。

所以我的问题是我应该使用哪种加入或联合声明,这样一封电子邮件只发送一次给一个包含他们所有产品的客户。

我读过的关于连接的教程总是有 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);

最佳答案

以下查询使用 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> 

关于php - 我应该使用哪个连接、联合或选择来处理多个表中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10377577/

相关文章:

php - 命名空间前缀未定义。如何自动定义它/忽略错误?

php - Docker:Nginx 和 PHP 容器:没有这样的文件或目录

php - 每当使用 £ 时,MySQL 或 PHP 都会附加一个 Â

c# - 运行 Scaffold-DbContext 时出现超时错误

php - MySQL + PHP - 查询相对格式日期

sql - 在 SQL Server 表 : which type should I choose? 中创建新的文本列

php - 需要一个正则表达式来解析 php 中带双引号的 csv 文件

mysql - MySQL字段类型如何转换?

sql - SQL将一个值替换为另一个

mysql - 寻找 mysql 查询来获取除同一行之外的列值