2012-04-30 28 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> 
相關問題