Mysql
選擇一組項目的第一個實例
我正在嘗試修改從一組客戶中提取最新訂單並提供 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) ;