sql >> データベース >  >> RDS >> Mysql

SQLタイムスタンプと在庫レベルに基づいて同じテーブルに結合します

    SQLへの変換はそれほど難しくありませんが、パフォーマンスが低下する可能性があります。これにより、商品が再入荷したときのタイムスタンプが取得されます:

    SELECT inv.*,
     ( SELECT MIN(`inv2`.`in_stock_at`)
       FROM inventories AS inv2
       WHERE inv2.`product_id` = inv.`product_id`   -- same product
         AND inv2.`pusher_id` = `inv`.`pusher_id`   -- same pusher
         AND `inv2`.`created_at` > inv.`created_at` -- later timestamp
         AND `inv2`.`item_count` > 0                -- in stock
     ) AS inStockAgain_at
    from `inventories` AS inv
    WHERE inv.`item_count` <= 0   -- out of stock
     -- AND inv.`product_id`=9
    

    編集:

    在庫がゼロの連続する行を削除するのはもっと複雑です:

    SELECT inv.*, dt.inStockAgain_at
    FROM inventories AS inv
    JOIN
     ( 
       SELECT product_id, pusher_id, 
          MIN(created_at) AS min_created_at,
         inStockAgain_at
       FROM
        (
          SELECT product_id, pusher_id, created_at,
           ( SELECT MIN(inv2.created_at)
             FROM inventories AS inv2
             WHERE inv2.product_id = inv.product_id -- same product
               AND inv2.pusher_id = inv.pusher_id   -- same pusher
               AND inv2.created_at > inv.created_at -- later timestamp
               AND inv2.item_count > 0              -- in stock
           ) AS inStockAgain_at
          FROM inventories AS inv
          WHERE inv.item_count <= 0  
        ) AS dt
       GROUP BY product_id, pusher_id, inStockAgain_at
     ) AS dt
    ON inv.product_id = dt.product_id
    AND inv.pusher_id = dt.pusher_id 
    AND inv.created_at = dt.min_created_at 
    

    フィドル を参照してください。




    1. マルチDCPostgreSQL:VPNを介して別の地理的場所にスタンバイノードを設定する

    2. レコードの深さを取得し、親レコードと祖先レコードをカウントするmysql

    3. Workbenchを使用してSSHトンネル経由でリモートMySQLサーバーに接続する

    4. 2つの選択が同等かどうかを確認します