我有三个表:company、products、company_to_products。
公司:身份证,姓名
---------------------
| 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 |
|--------------------------------|
company_to_products : company_id , product_id , price
-----------------------------------------------
| 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 |
|---------------------------------------------|
每家公司都销售相同型号的产品,这是我的搜索标准,尽管(有时)不同的品牌以不同的价格出售;有时是同一个品牌,但价格不同。
到目前为止,我只对根据给定型号选择三种价格最优惠的产品列表感兴趣,而与公司无关;因此,理论上,如果一家公司的价格都优于竞争对手,那么一家公司就可以占据所有前三名。
IE
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 |
|---------------------------------------------|
问题是,现在规格已经改变;我现在需要显示每个公司的最低价格,而不是简单地显示三个最低价格。
IE
-----------------------------------------------
| 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,但没有运气,该行其余部分的结果是任意的。