2017-08-08 60 views
0

这是一段MySQL代码,它在一个网站的后台运行。了解下面的MySQL逻辑

我想了解new列的含义。 具有单一订单的任何客户是否会标记为新= 1?

代码如下所示:

select 
a.id_order, 
IF((
     SELECT so.id_order 
     FROM `orders` so 
     WHERE so.id_customer = a.id_customer 
     AND 
     so.id_order < a.id_order 
     LIMIT 1) > 0, 0, 1) as new    // new keyword 

     FROM `orders` a 

     LEFT JOIN `customer` c ON 
     (c.`id_customer` = a.`id_customer`) 

回答

0

首先,我认为id_order从不为负或为零。

然后,如果客户订单的ID较小,则查询返回“0”。意图是标记第一个订单。

如果客户只有一个订单,那么它的值将始终为1,因为子查询将返回NULL

我会写的逻辑:

SELECT o.id_order, 
     (NOT EXISTS (SELECT 1 
        FROM orders so 
        WHERE so.id_customer = o.id_customer AND 
          so.id_order < o.id_order 
        ) 
     ) as is_first_order 
FROM orders o LEFT JOIN 
    customer c 
    ON c.id_customer = o.id_customer; 

LEFT JOIN应该是不必要的,如果所有的订单都有客户。事实上,JOIN是没有必要的,你可以用:

select o.id_order, 
     (NOT EXISTS (SELECT 1 
        FROM orders so 
        WHERE so.id_customer = o.id_customer AND 
          so.id_order < o.id_order 
        ) 
     ) as is_first_order 
FROM orders o ; 
0

“新”在这里括号中的if语句的列结果的名称

((
     SELECT so.id_order 
     FROM `orders` so 
     WHERE so.id_customer = a.id_customer 
     AND 
     so.id_order < a.id_order 
     LIMIT 1) > 0, 0, 1) 

IF

(SELECT so.id_order 
FROM `orders` so 
WHERE so.id_customer = a.id_customer 
AND so.id_order < a.id_order 
LIMIT 1) 
大于0

然后“新的”的列的值将是0 否则这将是1