0

必要なデータを取得するために結合する必要がある 2 つのテーブルがありますが、目的の結果を得るクエリはすべて非常に高価です。

製品テーブル (id、名前) と在庫テーブル (id、pid、サプライヤー、在庫、価格) があります。stock.pid は products.id の外部キーですが、各製品は複数のサプライヤーを持つことができるため、在庫テーブルに複数のエントリがあります。

私が必要としているのは、各製品の最安価格と現在の在庫を、製品レコードのすべてのデータと組み合わせて、価格の昇順に並べたものです。

私が試したのは(およびいくつかのバリエーション)です:

SELECT DISTINCT(pid), MIN(price), stock, p.*
FROM stock s LEFT (INNER) JOIN
     product
     ON pid = s.id
GROUP BY pid
ORDER BY price (LIMIT 100)
4

3 に答える 3

0

私は次のように問題を解決しました。また、一部のサプライヤーは特定の時刻を過ぎると時間どおりに配達できないため、現在の時刻を考慮したレベルを追加しました。私が含めなかったのはsum(stock)です。そのフィールドをsumStockとして製品テーブルに追加し、在庫レコードが変更されるたびに常に更新します。

SELECT    sp.price
,         p.*
FROM      products p 
LEFT JOIN stock_products sp
USING     (ean)
WHERE     sp.id = IFNULL(
          (SELECT    psi.id
           FROM      stock_products psi 
           JOIN      suppliers sup
           ON        psi.pid = sup.id
           WHERE     psi.ean = p.ean
           AND       psi.stock > 0
           ORDER BY  IF(sup.time>40667, sup.deliveryTime, sup.deliveryTime+86400)
           ,         price
           LIMIT 1)
          ,
          (SELECT    psi.id
           FROM      stock_products psi 
           JOIN      suppliers sup
           ON        psi.pid = sup.id
           WHERE     psi.ean = p.ean
           ORDER BY  IF(sup.time>40667, sup.deliveryTime, sup.deliveryTime+86400)
           ,         price
           LIMIT 1)
ORDER BY  price

まれに、商品に在庫がない場合にIFNULLを使用することに注意してください。私はまだそれらの記録を見せたいです。クエリは少し短くなりますが、これは私が使用することになった完全なソリューションです。

また、40667は現在の時刻を表す数値です。真夜中からの現在の秒数は何でもかまいません。

于 2012-10-11T09:26:08.407 に答える