【问题标题】:mysql sort column based on field from another tablemysql根据另一个表中的字段对列进行排序
【发布时间】:2013-08-21 10:27:31
【问题描述】:

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

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

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您确实应该在 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中工作

    【讨论】:

      【解决方案2】:

      恕我直言,您的表 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
      

      【讨论】:

      • 通过简单的连接,您的查询不会返回没有折扣的产品。
      • 两个表之间的关系是父子关系。我认为品牌是产品中的每一个存在。否则使用左外连接
      猜你喜欢
      • 2018-11-15
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      相关资源
      最近更新 更多