选择一组项目的第一个实例

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)的最佳方法是什么?

ype*_*eᵀᴹ 5

你查询说:

从一组客户中提取最近的订单,并且仅当该订单具有类型 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)