我希望标题不会太混乱 - 我不知道怎么称呼它。
想象一下,你有一张产品表:
+----+---------------------------+-------+
| id | name | stock |
+----+---------------------------+-------+
| 1 | 1. Product of set | 2 |
| 2 | 2. Product of set | 5 |
| 3 | 3. Product of set | 3 |
| 4 | Set of Product 1, 2 and 3 | 0 |
+----+---------------------------+-------+
产品1-3可以全部销售,但也可以作为一套(产品4)销售。所以我们有另一张桌子:
+---------+-------------+-------+
| product | set_product | count |
+---------+-------------+-------+
| 1 | 4 | 1 |
| 2 | 4 | 2 |
| 3 | 4 | 1 |
+---------+-------------+-------+
......表示产品4由1x产品1,2x产品2和1x产品3组成。
在产品表中有一列“库存”,表示每种产品目前有多少库存。
问题是:我如何通过一个SELECT获得产品4的库存(当然这取决于产品1-3的库存)?
要设置测试用例,我创建了这段代码:
CREATE TABLE products (
`id` int unsigned NOT NULL AUTO_INCREMENT, unique key(id),
`name` TINYTEXT,
`stock` int NOT NULL DEFAULT 0
);
CREATE TABLE sets (
`product` int unsigned NOT NULL,
`set_product` int unsigned NOT NULL,
`count` int NOT NULL
);
INSERT INTO products SET id=1, name="1. Product of set", stock=2;
INSERT INTO products SET id=2, name="2. Product of set", stock=5;
INSERT INTO products SET id=3, name="3. Product of set", stock=3;
INSERT INTO products SET id=4, name="Set of Product 1, 2 and 3";
INSERT INTO sets SET product=1, set_product=4, count=1;
INSERT INTO sets SET product=2, set_product=4, count=2;
INSERT INTO sets SET product=3, set_product=4, count=1;
答案 0 :(得分:2)
试试这个
select p.name, ifnull(min(ps.stock / s.count), p.stock) as stock
from products as p
left outer join sets as s on s.set_product = p.id
left outer join products as ps on ps.id = s.product
group by p.name
SQL FIDDLE
你也可以做联合解决方案
select p.id, p.name, min(ps.stock / s.count) as stock
from products as p
inner join sets as s on s.set_product = p.id
inner join products as ps on ps.id = s.product
group by p.id, p.name
union all
select p.id, p.name, p.stock
from products as p
where p.id not in (select distinct tt.set_product from sets as tt)
答案 1 :(得分:0)
您应该为所有套装产品选择最小库存。坚果你应该记住这个产品的集合数量:
select
coalesce( min( p.stock / s.`count`), 0)
as stock_product
from
products p
left outer join
sets s on
p.id = s.product
where
set_product = 4
答案 2 :(得分:0)
我会尝试这样的事情......(这是MS SQL,但它不应该离真相太远......)
SELECT DISTINCT s.set_product
, ISNULL(MIN((p.stock/s.count)),0) calculated_stock
FROM [sets] s
INNER JOIN products p
ON p.id = s.product
GROUP BY s.set_product;