0

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 番目のオプションを使用します。

とにかく助けてくれてありがとう!

4

4 に答える 4

0

以下は、要件に合わせて機能するはずです。

更新: 最初のクエリstart/end dateでは、セール価格も考慮されるようになりました

SELECT
  p.pid,
  p.products_name,
  p.products_model,
  pp.price as min_price,
  pp.sale_price as max_price
FROM
  products p
  JOIN products_prices pp ON ( p.pid = pp.pid )
  LEFT JOIN products_prices pp2 ON ( pp2.pid = pp.pid AND pp2.price > pp.price AND pp.sale_start_date BETWEEN pp2.sale_start_date AND pp2.sale_expire_date )
WHERE
  pp2.pid IS NULL AND NOW() BETWEEN pp.sale_start_date and pp.sale_expire_date

以下のものはmax、製品minに利用可能なの を取得しますprices

SELECT
  p.pid,
  p.products_name,
  p.products_model,
  MIN( LEAST( pp.price, pp.sale_price) ) as min_price,
  MAX( GREATEST( pp.price, pp.sale_price) ) as max_price
FROM
  products p
  JOIN products_prices pp ON ( p.pid = pp.pid )
WHERE
  pp.sale_price <> 0
GROUP BY
  p.pid

SQLFIDDLE

于 2013-04-20T09:09:42.530 に答える
0

それはあなたのクエリに依存します。

product から一部の値のみをクエリする場合、これが最適です。

select pid,products_name,products_model,
   (select min(price) from price where price.pid=product.pid) as min_price,
   (select max(price) from price where price.pid=product.pid) as max_price
 from product  where some_filter_here;

FULL テーブルを取得する必要がある場合は、これが最適です。

select a.pid,products_name,products_model,min_price,max_price 
     from product as a 
 left join ( 
   select pid,min(price) as min_price, max(price) as max_price 
        from price group by pid
           ) as b on b.pid=a.pid
于 2013-04-20T09:12:05.990 に答える
0
SELECT   products.*,
         MIN(IF(CURRENT_DATE BETWEEN sale_start_date AND sale_expire_date, sale_price, price)) min_price,
         MAX(price) max_price
FROM     products JOIN products_prices USING (pid)
GROUP BY pid

sqlfiddleで参照してください。

于 2013-04-20T09:53:57.577 に答える