mysql排序列基于另一个表的字段

时间:2013-08-20 15:30:57

标签: mysql sql

我有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%的折扣)

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

2 个答案:

答案 0 :(得分:4)

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

对于数据库规范化的这个和其他优点,请看这个问题: What is Normalisation (or Normalization)?

实际上,为了获得你可以做的价格(拥有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

您可以在此fiddle

中看到它正常工作

答案 1 :(得分:3)

恕我直言您的表格产品不正确,因为您必须使用字段链接品牌表的字段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