Mysql

選擇一組項目的第一個實例

  • March 7, 2018

我正在嘗試修改從一組客戶中提取最新訂單並提供 order_type 的現有查詢。

目前查詢工作正常(雖然有點慢,下面的所有列都已編入索引):

SELECT 
   DISTINCT(td1.product_id), 
   td1.customer_id, 
   td1.date_test_added,
   tdmi.product_type_id
FROM 
   order_history AS td1
   LEFT JOIN order_history td2     
   ON td1.customer_id = td2.customer_id AND td1.date_test_added < td2.date_test_added
   LEFT JOIN order_types tdmi      
   ON tdmi.product_id   = td1.product_id 
WHERE
  td2.date_test_added IS NULL
  AND tdmi.product_type_id = 31
  AND td1.customer_id IN (91000, 91001, 91002, 91003)

如果我將第一個連接中的小於運算符更改為大於,則不會返回任何結果。

更改此設置以提取最早訂單的最佳方法是什麼(基於 date_test_added)?

你查詢說:

從一組客戶中提取最近的訂單,並且僅當該訂單的產品類型為 31 時。

當你改變它時<>它說:

從一組客戶中提取最早的訂單,並且僅當該訂單的產品類型為 31 時。

因此,修改後的查詢可能不返回任何結果,即使是第一個查詢,具有相同的參數也會返回一些東西。當最早訂單的產品類型不同於 31 時,就會發生這種情況。


如果這不是查詢的意圖,但您想要產品類型為 31 的訂單中的最新(或最舊)訂單,則需要對其進行修改,因此反LEFT JOIN / IS NULL連接會考慮此限制。

其他一些小筆記:

  • LEFT JOIN order_types tdmi由於. _ INNER_ tdmi.product_type_id = 31_WHERE
  • DISTINCT不是函式。它修改了整個SELECT而不只是一列,所以括號是多餘的,只會帶來混亂。
  • 在一個不那麼小的註釋中,DISTINCT看起來很可疑。它可能可以被刪除。

查詢變為:

SELECT -- DISTINCT
   td1.product_id, 
   td1.customer_id, 
   td1.date_test_added,
   tdmi.product_type_id
FROM 
   order_history AS td1
   LEFT JOIN order_history td2   
       JOIN order_types tdmi2      
           ON  tdmi2.product_id = td2.product_id
           AND tdmi2.product_type_id = 31   
       ON  td1.customer_id = td2.customer_id 
       AND td1.date_test_added < td2.date_test_added
   JOIN order_types tdmi      
       ON  tdmi.product_id = td1.product_id
       AND tdmi.product_type_id = 31 
WHERE
  td2.date_test_added IS NULL
  AND td1.customer_id IN (91000, 91001, 91002, 91003) ;

引用自:https://dba.stackexchange.com/questions/199238