2 つのテーブルからいくつかの製品の価格帯を取得したいと考えています。
表 1 (製品):
pid | products_name | products_model
1 | Product 1.....| model 1
2 | Product 2.....| model 2
表 2 (products_prices):
pid | nerchant_id | price | sale_price | sale_start_date | sale_expire_date
1 | RVTBV | 11.90 | 0 | NULL | NULL
1 | QNUNU | 11.90 | 9.90 | 2013-05-01 | 2013-12-31
1 | YOLOR | 12.90 | 10.90 | 2013-04-01 | 2013-12-31
2 | RVTBV | 20.90 | 0 | NULL | NULL
2 | QNUNU | 29.90 | 25.90 | 2013-04-01 | 2013-12-31
2 | YOLOR | 29.90 | 0 | NULL | NULL
次のような価格帯で結果を取得するにはどうすればよいですか。
pid | products_name | products_model | min_price | max_price
1 | Product 1.... | model 1 ...... | 10.90 ... | 12.90
2 | Product 2.... | model 2 ...... | 20.90 ... | 29.90
メインクエリを使用して table1 から製品データを取得し、次に php foreach 製品のループを使用して、販売開始日と有効期限に応じて最小最大値を取得しています。
それはうまくいきますが、phpでのサブクエリは好きではありません。パフォーマンス上の理由から、私は 1 つの MySQL クエリを好みます。
助けてくれてありがとう。
これまでのところ、次のステートメントが最適です
SELECT p.pid,
p.manufacturers_id,
p.products_image,
p.products_name,
(select min(if(CURRENT_DATE BETWEEN pp.sale_start_date AND pp.sale_expire_date and pp.sale_price>'0', pp.sale_price, pp.price)) from products_prices pp where p.pid = pid) as min_price,
(select max(if(CURRENT_DATE BETWEEN pp.sale_start_date AND pp.sale_expire_date and pp.products_sale_price>'0', pp.sale_price, pp.price)) from products_prices pp where p.pid = pp.pid) as max_price
FROM products p
WHERE p.products_status = '1'
AND p.categories_id = '1'
ORDER BY min_price ASC LIMIT 0, 100
それを少し最適化することは可能ですか?
履歴書:
解決策が単純すぎてわからないことがあります;)
プロジェクトは価格比較プラットフォームです。製品は 1 時間ごとなどに更新されますが、すべての価格が変わるわけではありません。では、10% が更新されるとしましょう。ただし、Web サイトにアクセスするたびにデータを取得する必要があります。
この場合、書き込みよりも読み取りの方が多くなります (80-20)。
price_data が変更された場合に一度だけ更新する 2 つの列 (min_price と max_price) を製品テーブルに追加できます。
一方では、アップデートはもう少し複雑になりますが、それはドラマではありません. 一方、データは非常に高速に取得されます。
15000 個の製品に基づいて 100 行を取得するための testet 3 オプションがあります: 最悪: アプローチによるグループ (1 秒以上) 良い: arheops のアプローチ (0,12 秒) 最良: 2 つの余分な列 (0,07 秒) で 1 回更新)
私は 3 番目のオプションを使用します。
とにかく助けてくれてありがとう!