我有一个定制商店,我需要重做运费。但是,有时候这种情况有时候会发生,与此同时,我需要在购物车只包含一定范围的产品时添加运费选项。
所以有一个ship_method表
id menuname name zone maxweight
1 UK Standard ukfirst 1 2000
2 UK Economy uksecond 1 750
3 Worldwide Air world_air 4 2000
为此,我添加了另一列prod_restrict,对于现有的列为0,对于受限制的列为1,以及一个名为ship_prod_restrict的新表,其中包含两列,ship_method_id和item_id,列出了运输类别中允许的产品。 所以我需要做的就是查看我的交易,并且对于每个购物车,只需检查哪些运输方式是prod_restrict为0或者有1并且购物车中没有产品不在限制表中。
不幸的是,似乎因为你不能从外部查询到内部查询的值,我无法找到一种巧妙的方法。 (编辑以显示由于以下评论的完整查询)
select ship_method.* from ship_method, ship_prod_restrict where
ship_method.`zone` = 1 and prod_restrict='0' or
(
prod_restrict='1'
and ship_method.id = ship_prod_restrict.ship_method_id
and (
select count(*) from (
select transactions.item from transactions
LEFT JOIN ship_prod_restrict
on ship_prod_restrict.item_id = transactions.item
and ship_prod_restrict.ship_method_id=XXXXX
where transactions.session='shoppingcartsessionid'
and item_id is null
) as non_permitted_items < 1 )
group by ship_method.id
为您提供该部分是否匹配的列表,并作为内部查询,但我无法在那里获得该ship_method_id(在XXXXX)。
有没有一种简单的方法可以做到这一点,或者我是否采取了错误的方式?我目前无法更改主要发货表,因为现在已经存在,但其他位可能会发生变化。我也可以在PHP中做,但你知道,这似乎是作弊!
答案 0 :(得分:1)
不确定计数是如何重要的,但这可能会更轻一点 - 没有完整的表模式转储很难说:
SELECT COUNT(t.item) FROM transactions t
INNER JOIN ship_prod_restrict r
ON r.item_id = t.item
WHERE t.session = 'foo'
AND r.ship_method_id IN (**restricted, id's, here**)