MySQL问题编写查询

时间:2011-04-16 19:39:27

标签: mysql

我目前有一个表格,其中包含以下字段的目录信息:

目录,价格,product_id,尺寸,pack_size,stock_level

产品最多可在目录中出现30次(具有不同尺寸和/或不同包装尺寸的相同产品必须具有唯一的catalog_id)

我现在想要显示一个左侧大小的表,顶部的包大小和价格作为数据,但不知道如何编写查询。

2 个答案:

答案 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)

所以,你正在寻找一组所有红色小部件,包括:

  • 小红色小部件
  • 小红色小部件(5件装)
  • 中红色小工具
  • 中红色小部件(每包5个)
  • 大红色小工具
  • 大红色小部件(5件装)

它们都有单独的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;

我倾向于亲自选择第二种解决方案,但无论哪种方式都可行。