我有以下表,標準店的數字每日提要:充分利用店鋪數據庫
(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
涉及到進行銷售的用戶。 total
和tendered
都是FLOAT類型。 flag
是VARCHAR類型,可能是Free Order
。
表receipts
:
id | oID | pID | quantity | ts
1 1 26 1 2013-11-21 08:11:25
Receipts
保持用於出售每個唯一的產品類型的線。 oID
是INT型,涉及表sales
的id
。 pID
屬於INT類型,涉及表products
的id
。
表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個字符的限制,我無法完成超過半天的數據。
而不是所有這些,只是提供適當的DDL - 與期望的結果和你盡力而爲的日期。並且通常關於(可疑的)棄用函數和未轉義數據的警告 – Strawberry
也許你可以提供一些SQLFiddle以及一些示例數據和期望的結果。 –
@Strawberry我真的不知道你的DDL引用了什麼。我認爲提供儘可能多的信息有助於解決問題。 – Chud37