【发布时间】:2014-09-24 20:24:21
【问题描述】:
我正在尝试从存储在 xcart_order_details 中的有效销售订单中计算库存数量。我还想只计算 x 天内下达的订单中的库存,这些订单的状态为“已处理”“P”或“排队”“Q”,以及库存类型是否与某些位置匹配; C1 库存、C2 库存等。
这在我们旧的 xcart 数据库中曾经相对简单;
SELECT COUNT(`amount`)
FROM `xcart_order_details`
WHERE `productid` IN (
SELECT `productid`
FROM `xcart_products` WHERE `orderid` IN
(SELECT `orderid`
FROM `xcart_orders`
WHERE `date` > ".$date_range."
AND (`status` = 'P'
OR `status` = 'Q'))
AND (LOWER(param01) = 'c1 stock'
OR LOWER(param01) = 'c2 stock'
OR LOWER(param01) = 'g stock'
OR LOWER(param01) = 'stock')
AND `productid` = ".$safe_prodid.")
此查询有效。但是现在我们的库存位置存储在另一个名为 xcart_extra_field_values 的表中,并且必须在 fieldid = 5 的地方检索;
我尝试使用连接从 xcart_extra_field_values 中的 fieldid = 5 获取值字段,并尝试执行我正在执行的上述查询,但它不起作用。
SELECT COUNT(`a.amount`)
FROM xcart_order_details a,
xcart_extra_field_values b
WHERE a.productid IN (
SELECT productid
FROM xcart_products WHERE orderid IN
(SELECT orderid
FROM xcart_orders
WHERE date > 1409529600
AND (status = 'P'
OR status = 'Q'))
AND (LOWER(b.value) = 'c1 stock'
OR LOWER(b.value) = 'c2 stock'
OR LOWER(b.value) = 'g stock'
OR LOWER(b.value) = 'stock')
AND (a.productid = b.productid)
AND (a.productid = 4169)
AND (b.fieldid = 5)
不幸的是,这个查询不起作用,我知道这是一个语法问题,但我得到的错误没有任何帮助。
谁能解释我做错了什么?
【问题讨论】:
-
你得到什么错误?
-
我得到:“#1064 - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在第 19 行的 '' 附近使用正确的语法”事后诸葛亮是有道理的,但当时并不清楚。
-
奇怪的是,顺便说一句,您计算有数量的记录。如果这是故意的,并且您没有从表中选择任何其他值,那么如果您在 WHERE 子句 (
AND amount IS NOT NULL)) 中排除 NULL 并改为计数记录 (COUNT(*)),它将更具可读性。如果数量永远不会为 NULL,而不是计数记录(再次COUNT(*)),而不是数量的非空出现,无论如何都不能为空。 (当然,如果你想计算总金额,你可以SUM这些金额来得到这个总数。)