我有三个表:公司,产品,公司_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 ,但没有运气,其余部分的结果是任意的。
答案 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;