2014-01-24 76 views
-1

我有以下表,標準店的數字每日提要:充分利用店鋪數據庫

id始終是主鍵,自動遞增,ts總是鍵入TIMESTAMP,更新ON_UPDATE CURRENT_TIMESTAMP)

sales

id | total | tendered | flag | userID | ts 
1  0.6  0.6  0  4  2013-11-21 08:12:23 

Sales是父表,userID涉及到進行銷售的用戶。 totaltendered都是FLOAT類型。 flag是VARCHAR類型,可能是Free Order

receipts

id | oID | pID | quantity | ts 
1  1  26  1  2013-11-21 08:11:25 

Receipts保持用於出售每個唯一的產品類型的線。 oID是INT型,涉及表salesidpID屬於INT類型,涉及表productsid

products

id | name | price | cID | display | ts 
1 Mars 0.6  3  1  2014-01-17 07:55:25 

Products爲數據庫中的每個產品的中央數據。這是一個火星酒吧的線路。 cID涉及表categories中的id

categories

id | name | display | ts 
3 Snacks  1  2013-11-14 12:06:44 

Categories是表保持關於每個類別的所有數據,並且可以具有與單個行的多種產品。 display是int類型,當該類別啓用或禁用規定(1 =「真」)

我的問題是,我想這樣的輸出信息:

**Snacks** 
(name) (quantity) (price) (total) 
Fruit  3   50p  £1.50 
Twix  1   60p  60p 
Boost  1   60  60p 

**Hot Drinks** 
(name)   (quantity) (price) (total) 
English Tea 15  60p  £9.00 
Speciality Teas 2  60p  £1.20 

其中我有以下SQL爲:

SELECT categories.name AS category, products.name, pID, 
(SELECT SUM(quantity) FROM receipts WHERE pID=r.pID AND DATE(ts) = CURDATE()) AS quantity, 
products.price,r.ts 
FROM receipts r 
LEFT JOIN products ON r.pID = products.id 
LEFT JOIN categories ON products.cID = categories.id 
WHERE DATE(r.ts) = CURDATE() 
GROUP BY r.pID 
ORDER BY categories.name; 

這似乎給我正確的信息,但我不是100%確定。如果任何人都可以驗證這是有效的,我將非常感激。但是,當我想看到一個特殊的日子,我得到不同尋常的數字與下面的SQL:

$postfrom = $_POST['from_mm']."/".$_POST['from_dd']."/20".$_POST['from_yy']; 
$postto = $_POST['to_mm']."/".$_POST['to_dd']."/20".$_POST['to_yy']; 

$from = strtotime($postfrom . " 6:00"); 
$to = strtotime($postto . " 23:59"); 
$itemised = select("SELECT categories.name AS category, products.name, pID, 
(SELECT SUM(quantity) FROM receipts WHERE pID = r.pID AND UNIX_TIMESTAMP(r.ts) > '{$from}' AND UNIX_TIMESTAMP(r.ts) < '{$to}') 
AS quantity, products.price 
FROM receipts r 
LEFT JOIN products ON r.pID = products.id 
LEFT JOIN categories ON products.cID = categories.id 
WHERE UNIX_TIMESTAMP(r.ts) > '{$from}' 
AND UNIX_TIMESTAMP(r.ts) < '{$to}' 
GROUP BY r.pID 
ORDER BY categories.name;"); 

功能「選擇」只是返回SQL表的數組)。問題是,我可以通過在PHP中循環並以這種方式添加它來輕鬆找到結果。但我知道這可能與SQL,我只是不知道爲什麼它不工作。有人可以幫忙嗎?

編輯 SQL示例小提琴在這裏:http://sqlfiddle.com/#!2/23af4儘管由於8000個字符的限制,我無法完成超過半天的數據。

+0

而不是所有這些,只是提供適當的DDL - 與期望的結果和你盡力而爲的日期。並且通常關於(可疑的)棄用函數和未轉義數據的警告 – Strawberry

+0

也許你可以提供一些SQLFiddle以及一些示例數據和期望的結果。 –

+1

@Strawberry我真的不知道你的DDL引用了什麼。我認爲提供儘可能多的信息有助於解決問題。 – Chud37

回答

2

試試這個:

SELECT categories.name AS category, products.name AS name, 
receipts.quantity AS quantity, products.price AS price, 
(receipts.quantity * products.price) AS total 
FROM categories 
JOIN products 
ON categories.id = products.cID 
JOIN receipts 
ON receipts.pID = products.ID 

WHERE DATE(receipts.ts) = CURDATE() 
ORDER BY categories.name 

SQLFiddle demo

關於日期限制,你可以使用BETWEEN ... AND ...指定的日期和時間。使用相對於當前日期和時間的絕對日期和時刻,例如WHERE DATE(receiptts.ts)BETWEEN concat(curdate()-5,'6:00:00 AM')AND curdate()-4