companys、products、companys_to_products の 3 つのテーブルがあります。
会社: 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 |
|--------------------------------|
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 |
|---------------------------------------------|
各会社は同じモデルの製品を販売していますが、これは私の検索基準ですが、(場合によっては) 異なるブランドで異なる価格で販売されています。同じブランドでも、価格が異なる場合があります。
これまでは、会社に関係なく、特定のモデルに基づいて最も価格の高い 3 つの製品のリストを選択することにのみ関心がありました。したがって、理論的には、価格がすべて競合他社よりも優れている場合、1 つの企業が 3 つのトップ スポットすべてを占める可能性があります。
すなわち
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 |
|---------------------------------------------|
問題は、仕様が変更されたことです。単純に 3 つの最低価格を表示するのではなく、各企業の最低価格を表示する必要があります。
すなわち
-----------------------------------------------
| company_id | product_id | price |
|----------------------------------------------
| 1 | 2 | 24.00 |
| 2 | 2 | 22.00 |
| 3 | 4 | 20.00 |
|---------------------------------------------|
この 2 番目の結果セットでは、3 番目の垂直製品は会社 3 ではなく、会社 1 のものになり、3 つの会社のそれぞれが結果セットに 1 回ずつ表示されます。
これを処理できる単一の SQL クエリを作成するのに苦労しています。単純に各企業を選択してから、PHP foreach を介してそれぞれを実行して目的を達成することは避けたいと思います。GROUP BY company_idを試みましたが、運が悪かったため、行の残りの部分が任意になりました。