我正在嘗試製作一個可打印頁面,其中有指定製造商的所有銷售,列出所有產品之間的指定日期。如果沒有發生過任何銷售,它應該顯示0加入表格並用指定值替換空值
的表格
// Manufacturer table
// mid, manufacturer
// Products table
// pid, product, ref_manufacturer_id
// Orders table
// oid, orderPrice, orderDateTime, ref_product_id
而且其工作方式查詢(無日期限制)
SELECT prod.product, COALESCE(COUNT(pord.oid),0) AS orderCount,
COALESCE(SUM(pord.orderPrice),0) AS orderSum
FROM product_manufacturer AS manu
JOIN product_list AS prod ON prod.ref_manufacturer_id = manu.mid
LEFT JOIN product_orders AS pord ON pord.ref_product_id = prod.pid
WHERE manu.mid = :manu_id
GROUP BY prod.product;
但只要我加入到WHERE語法
WHERE manu.mid = :manu_id AND DATE(pord.orderDateTime) BETWEEN :orders_start AND :orders_end
我正在使用PHP PDO連接並驗證manu_id是int並且orders_start/end被轉換爲MySQL日期格式。
但是我試圖找出的問題是什麼導致了這個問題,當我添加日期限制時,每個沒有訂購的產品都不會顯示在輸出上?在創建表
CREATE TABLE product_list (
pid bigint(20) unsigned NOT NULL AUTO_INCREMENT,
product varchar(255) NOT NULL,
ref_manufacturer_id bigint(20) unsigned NOT NULL,
PRIMARY KEY (pid),
KEY ref_manufacturer_id (ref_manufacturer_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE product_manufacturer (
mid bigint(20) unsigned NOT NULL AUTO_INCREMENT,
manufacturer varchar(255) NOT NULL,
PRIMARY KEY (mid),
UNIQUE KEY manufacturer (manufacturer)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE product_orders (
oid bigint(20) unsigned NOT NULL AUTO_INCREMENT,
orderPrice float(10,2) NOT NULL,
orderDatetime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
red_product_id bigint(20) unsigned NOT NULL,
PRIMARY KEY (oid),
KEY red_product_id (red_product_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
比MichałPowaga設定的簡單得多。這次真是萬分感謝。 – Gurnarok 2012-01-16 08:13:21
你可以(或應)BETWEEN取代'DATE(pord.orderDateTime):orders_start AND:orders_end'用'(pord.orderDateTime> =:orders_start)AND(pord.orderDateTime
2012-01-16 14:25:46
(我猜這兩個參數是日期)。 – 2012-01-16 14:28:52