簡體   English   中英

按訂單類型過濾產品

[英]Filter products by orders type

我正在嘗試以“已分配”類型的訂單獲取所有產品。 但是我的 sql 有問題,我認為where orders.id in ()是問題所在。 但我不知道該怎么做。

產品有許多不同類型的訂單(已分配、退役、服務)。 我需要過濾“已分配”類型的最新訂單中的產品,不包括“服務”。

select `products`.`id` from `products` 
inner join `orders_products` on `products`.`id` = `orders_products`.`product_id` 
inner join `orders` on `orders_products`.`order_id` = `orders`.`id` 
where orders.id in (
    select MAX(order_id) from `orders_products` 
    where `product_id` = products.id
) 
and `orders`.`type_id` in (
    select `id` from `order_types` where `code` in ('assigned')
) 
group by products.id

樣本數據

order_types

[
  {id: 1, code: "assigned"},
  {id: 2, code: "retired"},
  {id: 3, code: "service"},
]

產品

[
  {id: 1},
  {id: 2},
  {id: 3},
  {id: 4},
  {id: 5}
]

訂單

[
  {id: 1, type_id: 1}, // assigned
  {id: 2, type_id: 3}, // service
  {id: 3, type_id: 3}, // service
  {id: 4, type_id: 2}, // retired
  {id: 5, type_id: 1}, // assigned
  {id: 6, type_id: 3}, // service
  {id: 7, type_id: 3}, // service
]

訂單產品

[
  {order_id: 1, product_id: 1}, <--
  {order_id: 2, product_id: 1},
  {order_id: 3, product_id: 2},
  {order_id: 4, product_id: 3},
  {order_id: 5, product_id: 4}, <--
  {order_id: 6, product_id: 4},
  {order_id: 7, product_id: 5},
]

尋找結果

SQL 必須退回產品 id 1, 4

這回答了問題的原始版本。

你所描述的聽起來像:

select op.product_id
from orders_products op join
     orders o
     on op.order_id = o.id join
     order_types ot
     on ot.id = oo.type_id and
        ot.code = 'assigned'
group by op.product_id;

筆記:

  • 表別名使查詢更易於編寫和閱讀。
  • 反引號只會讓一切看起來凌亂、難以書寫、難以閱讀。
  • 我認為您的where子句中沒有第一個子查詢的理由。
  • 您不需要products表,因為產品 id 在order_products中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM