2017-08-08 19 views
0

これは、Webサイトのバックグラウンドで実行されているMySQLコードです。MySQLロジックの理解

私はnew列の意味を理解しようとしています。 1件の注文を受けた顧客は、新規= 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が負またはゼロになることはありませんと仮定しましょう。

顧客の注文番号が小さい場合、クエリは「0」を返します。その意図は最初の注文にフラグを立てることです。

顧客が注文を1つしか持たない場合、そのサブクエリはNULLを返すため、その値は常に1になります。

私はロジックを記述します。すべての注文は、顧客を持っている場合

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は不要でなければなりません。

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である:実際には、 JOINはあなただけ使用することができ、全く必要ありません0より大きい
(SELECT so.id_order 
FROM `orders` so 
WHERE so.id_customer = a.id_customer 
AND so.id_order < a.id_order 
LIMIT 1) 

その後、「新しい」列の値は、それが可能になるそうでなければ0 になります1

関連する問題