【问题标题】:Select each company's lowest price for product with specific criteria为具有特定标准的产品选择每个公司的最低价格
【发布时间】:2013-06-15 10:18:15
【问题描述】:

我有三个表:company、products、company_to_products。

公司:id名称

---------------------
|   id   |   name   |
|--------------------
|    1   | Company 1|
|    2   | Company 2|
|    3   | Company 3|
|-------------------|

产品:id品牌型号

----------------------------------
|   id   |   brand   |   model   |
|---------------------------------
|    1   | Brand 1   | Horizontal|
|    2   | Brand 1   |  Vertical |
|    3   | Brand 2   | Horizontal|
|    4   | Brand 2   |  Vertical |
|    5   | Brand 3   | Horizontal|
|    6   | Brand 3   |  Vertical |
|--------------------------------|

companies_to_products:company_idproduct_id价格

-----------------------------------------------
|   company_id   |   product_id   |   price   |
|----------------------------------------------
|        1       |        5       |   19.00   |
|        1       |        2       |   24.00   |
|        1       |        1       |   18.00   |
|        2       |        3       |   21.00   |
|        2       |        2       |   22.00   |
|        3       |        1       |   17.00   |
|        3       |        4       |   20.00   |
|        3       |        6       |   23.00   |
|---------------------------------------------|

每家公司都销售相同型号的产品,这是我的搜索条件,尽管(有时)不同品牌的价格不同;有时是同一个品牌,但价格不同。

到目前为止,我只对根据给定型号选择三种价格最优惠的产品列表感兴趣,而不管是哪家公司;因此,从理论上讲,如果一家公司的价格都优于竞争对手,那么一家公司就可以占据所有三个头把交椅。

SELECT ctop.price, c.\*, p.\* 
FROM companies_to_products ctop 
LEFT JOIN products p 
ON p.id = ctop.product_id 
LEFT JOIN companies c 
ON c.id = ctop.company_id 
WHERE p.model = "Vertical" 
ORDER BY ctop.price ASC LIMIT 3

会回来

-----------------------------------------------
|   company_id   |   product_id   |   price   |
|----------------------------------------------
|        2       |        2       |   22.00   |
|        3       |        4       |   20.00   |
|        3       |        6       |   23.00   |
|---------------------------------------------|

问题是,现在规格变了;我现在需要显示每个公司的最低价格,而不是简单地显示三个最低价格。

-----------------------------------------------
|   company_id   |   product_id   |   price   |
|----------------------------------------------
|        1       |        2       |   24.00   |
|        2       |        2       |   22.00   |
|        3       |        4       |   20.00   |
|---------------------------------------------|

在第二个结果集中,第三个垂直产品不再是公司 3 的产品,而是公司 1 的产品,因此这三个公司中的每一个都在结果集中出现一次。

我很难制定可以处理此问题的单个 SQL 查询。我宁愿避免简单地选择每家公司,然后通过 PHP foreach 运行每家公司以获得我所追求的。我尝试了 GROUP BY company_id,但没有运气,该行其余部分的结果是任意的。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    仅适用于 MYSQL

    select comp.id `Company_Id`, prod.id `Product_Id`, MIN(cop.price)
    from companies comp
    inner join companies_to_products cop on comp.id=cop.company_id
    inner join products prod on cop.product_id=prod.id 
    where prod.model='Vertical'
    group by `Company_Id`
    

    SQL FIDDLE

    【讨论】:

      【解决方案2】:

      你试过 min() 吗?我刚刚使用您的数据进行了尝试,它有效。

      select company_id,product_id,min(price)
      from ctop left join products on products.product_id=ctop.product_id
      where model="Vertical"
      group by company_id;
      

      【讨论】:

      • 这种方法确实得到了正确的价格,也就是说每个公司可以提供的最低价格;但是,此查询返回的产品信息是任意的。当我将此应用于我的生产数据库时,我得到了正确的价格,但产品品牌却是错误的。
      猜你喜欢
      • 2020-08-03
      • 2013-01-14
      • 2018-04-26
      • 2017-12-05
      • 1970-01-01
      • 2015-11-05
      • 2020-10-29
      • 2020-03-05
      • 2016-04-25
      相关资源
      最近更新 更多