选择具有特定标准的每个公司的产品最低价格

时间:2013-06-15 10:18:16

标签: mysql

我有三个表:公司,产品,公司_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_id product_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   |
|---------------------------------------------|

在第二个结果集中,第三个 Vertical 产品不再是公司3,而是公司1,因此三个公司中的每个公司都会在结果集中显示一次。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你试过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;