MySQL:如果另一个表包含某个值,则在对字段求和时忽略行

时间:2013-05-02 16:55:41

标签: php mysql sql database conditional

我有三个表,一个称为订单(仅包含客户信息),另一个称为orders_total(包含订单小计,折扣和总计),最后一个称为orders_products(包含订购商品的名称和价格)。它们都被称为orders_id的公共字段绑定。

我正在尝试为包含项目X的订单(来自orders_products表)汇总(总和)总销售收入,但由于某种原因,当我引入第三个表格时,销售收入的总和没有正确累加( orders_products)。我知道如何使用三个表中的任意两个分别进行聚合和项异常,但我的复杂性是通过引入第三个表来组合这两个函数。到目前为止,这是我正常工作的查询,只有两个原始表:

SELECT o.orders_id, ot.orders_id, o.delivery_state, SUM(ot.revenue) AS ordersum
FROM orders_total ot, orders o
WHERE ot.orders_id = o.orders_id
GROUP BY o.delivery_state
ORDER BY ordersum DESC;

如何实现异常以忽略包含Item X的订单?

2 个答案:

答案 0 :(得分:1)

您可以简单地从原始查询中排除通过子选择识别的任何订单:

SELECT o.orders_id, ot.orders_id, o.delivery_state, SUM(ot.revenue) AS ordersum
FROM orders_total ot
INNER JOIN orders o ON ot.orders_id = o.orders_id
WHERE ot.orders_id NOT IN (SELECT orders_id FROM orders_products WHERE product_name = '?')
GROUP BY o.delivery_state
ORDER BY ordersum DESC;

请注意,?代表您要排除的product_name。

您也可能不希望orders_id信息作为选择的一部分,因为这是关于此聚合的无意义数据。

要使此查询运行良好,请确保您具有索引:

orders_products.product_name
orders.delivery_date
orders.orders_id
orders_total.orders_id

答案 1 :(得分:0)

在主查询中加入一个子查询,该子查询选择包含项目X的订单,然后过滤掉SUM()参数中没有的订单。

SELECT
    o.orders_id,
    ot.orders_id,
    o.delivery_state,
    SUM(CASE WHEN op.orders_id IS NULL THEN ot.revenue ELSE 0 END) AS ordersum

FROM orders_total ot

INNER JOIN orders o
ON ot.orders_id = o.orders_id

LEFT OUTER JOIN (
    SELECT DISTINCT orders_id
    FROM orders_products
    WHERE ... -- Add your condition to select only item X
) op
ON op.orders_id = o.orders_id

GROUP BY o.delivery_state

ORDER BY ordersum DESC;