1

我有 2 表产品和品牌。

Products    

+------------+-------------------------------------+------------+-------+
| product_id | title                               | brand_name | price |
+------------+-------------------------------------+------------+-------+               
| 1          | Pacific Evolution 26" Mountain Bike | Pacific    | 100   |
+------------+-------------------------------------+------------+-------+
| 2          | Schwinn Riverside Cruiser           | Schwinn    | 200   |
+------------+-------------------------------------+------------+-------+                   

Brands
+-----------+-------------+----------+
| brand_id  | brand_name  | discount |
+-----------+-------------+----------+
| 22        | Schwinn     | 10       |
+-----------+-------------+----------+

如果品牌有折扣,产品的价格会发生变化。(在我的表格示例中,Schwinn 品牌有 10% 的折扣)

在我的情况下,如何按价格升序输出产品列表?

4

2 回答 2

4

您确实应该在产品表中使用brand_id 而不是brand_name。这样,如果您更改品牌名称,则必须在两个表中进行更改。

对于数据库规范化的这个和其他优点,请参阅这个问题: 什么是规范化(或规范化)?

实际上,要获得您可以做的价格(拥有brand_id,您将加入它而不是brand_name):

SELECT p.product_id, 
       p.title, 
       p.brand_name, 
       p.price,
      (p.price*(1-ifnull(b.discount,0) * 0.01)) AS discounted_price
FROM products p
LEFT JOIN brands b
    ON p.brand_name = b.brand_name
ORDER BY discounted_price ASC

你可以看到它在这个小提琴中工作

于 2013-08-20T16:14:12.897 回答
3

恕我直言,您的表 PRODUCTS 不正确,因为您必须使用字段来链接品牌表的字段 brand_id。

另一个建议,恕我直言,折扣字段我以符号 0.1 存储在十进制字段中(表示 10%)。

因此,您可以使用 JOIN 编写查询以通过这种方式获取结果(我假设您将更改两个表之间的引用)

SELECT p.product_id, p.title, b.brand_name, p.price,
(p.price * (1 - b.discount * 0.01)) as discounted_price
FROM products p
JOIN brands b
on p.brand_id = b.brand_id
order by (p.price * (1 - b.discount * 0.01)) asc
于 2013-08-20T15:47:30.343 回答