我目前有一个表格,其中包含以下字段的目录信息:
目录,价格,product_id,尺寸,pack_size,stock_level
产品最多可在目录中出现30次(具有不同尺寸和/或不同包装尺寸的相同产品必须具有唯一的catalog_id)
我现在想要显示一个左侧大小的表,顶部的包大小和价格作为数据,但不知道如何编写查询。
答案 0 :(得分:2)
SELECT
ci.size
,sum(if(ci.pack_size=1,ci.price,null)) as pack_size1
,sum(if(ci.pack_size=2,ci.price,null)) as pack_size2
,sum(if(ci.pack_size=3,ci.price,null)) as pack_size3
,sum(if(ci.pack_size=4,ci.price,null)) as pack_size4
FROM catalog_info ci
WHERE ci.product_id = 345
GROUP BY ci.size -- WITH ROLLUP
如果取消注释“WITH ROLLUP”,MySQL将在末尾添加额外的授权总计行。
多个产品的相同查询。
SELECT
ci.product_id
,ci.size
,sum(if(ci.pack_size=1,ci.price,null)) as pack_size1
,sum(if(ci.pack_size=2,ci.price,null)) as pack_size2
,sum(if(ci.pack_size=3,ci.price,null)) as pack_size3
,sum(if(ci.pack_size=4,ci.price,null)) as pack_size4
FROM catalog_info ci
WHERE ci.product_id BETWEEN 1 AND 100
GROUP BY ci.product_id ASC, ci.size DESC -- WITH ROLLUP
请注意,使用汇总,无法添加order by
子句,但可以影响组子句(ASC,DESC)中的隐式排序,如图所示以上。
取消注释with rollup
以添加授权总计行。
答案 1 :(得分:0)
所以,你正在寻找一组所有红色小部件,包括:
它们都有单独的ID。如果您可以保证ID始终在连续范围内,您可以执行类似
的操作SELECT * FROM products WHERE product_id BETWEEN 45 AND 50
然而,保持身份证号码的一致性将是一个痛苦的屁股。接下来的方法是添加一大堆OR子句:
SELECT * FROM products WHERE
product_id = 45
OR product_id = 46
OR product_id = 47
OR product_id = 87
OR product_id = 93
但这再次无法解决您不知道组中所有产品的数量的问题。
因此,您需要以两种方式之一更改数据库。
方法1:更改产品表以添加包含产品系列ID号的新列。因此:
ALTER TABLE products ADD COLUMN `family_id` INT(10) NOT NULL DEFAULT 0 AFTER product_id
然后手动浏览并将相同的family_id添加到产品组中:
UPDATE products SET family_id = 1 WHERE product_id = 45;
UPDATE products SET family_id = 1 WHERE product_id = 46;
UPDATE products SET family_id = 1 WHERE product_id = 47;
UPDATE products SET family_id = 1 WHERE product_id = 48;
这样你就可以通过这样一个简单的查询来解决这些问题:
SELECT * FROM products WHERE family_id = 1;
方法2:创建第二个表来跟踪单个产品和产品系列之间的关系:
CREATE TABLE `families` (
`relationship_id` INT(10) PRIMARY KEY AUTO_INCREMENT,
`family_id` INT(10) NOT NULL DEFAULT 0,
`product_id` INT(10) NOT NULL DEFAULT 0
);
然后将所有关系数据放在那里:
INSERT INTO families (family_id, product_id) VALUES (1, 45);
INSERT INTO families (family_id, product_id) VALUES (1, 46);
INSERT INTO families (family_id, product_id) VALUES (1, 47);
INSERT INTO families (family_id, product_id) VALUES (1, 87);
你可以通过加入再次获得它:
SELECT p.* FROM products p, families f
WHERE p.product_id = f.product_id
AND family_id = 1;
我倾向于亲自选择第二种解决方案,但无论哪种方式都可行。