sql >> Database teknologi >  >> RDS >> Mysql

SQL Tilslut samme tabel baseret på tidsstempel og lagerniveau

At oversætte til SQL er ikke så svært, men ydeevnen kan være dårlig. Dette vil give dig tidsstemplet, da produktet var tilbage på lager:

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

Rediger:

Fjernelse af på hinanden følgende rækker med nul lager er mere kompliceret:

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 

Se violin




  1. Sådan får du gårsdagens dato i MySQL

  2. MySQLdb - Tjek om rækken findes Python

  3. Returner lagrede procedurer og funktioner i en SQL Server-database:RUTINER (T-SQL-eksempler)

  4. Vælg rækker fra én tabel, sammenslut den seneste række fra en anden tabel med en-til-mange-relation