a c*_*der 2 mysql select greatest-n-per-group
我正在尝试修改从一组客户中提取最新订单并提供 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)
Run Code Online (Sandbox Code Playgroud)
如果我将第一个连接中的小于运算符更改为大于,则不会返回任何结果。
更改此设置以提取最早订单(基于 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) ;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2190 次 |
| 最近记录: |