0

我有三个表: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,但没有运气,该行其余部分的结果是任意的。

4

2 回答 2

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 小提琴

于 2013-06-15T11:28:28.557 回答
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;
于 2013-06-15T10:34:00.513 回答