2014-09-01 79 views
0

我有以下這周圍有的MySQL與IF具有計數和子查詢選擇statment

SELECT 
       ch.*, 
       IF (

         (
          SELECT COUNT(*) 
          FROM invoice_items ii 
          WHERE 
           ii.chargeid = ch.chargeid 
         ) > 0, 1, 0 
       ) AS billed 
       FROM charges ch 
       WHERE 
       ch.customerid = %s 

       AND ch.status!='completed' 

,但我無法理解的

   (
        SELECT COUNT(*) 
        FROM invoice_items ii 
        WHERE 
         ii.chargeid = ch.chargeid 
       ) > 0 
的部分IF語句和子查詢包裹的SQL語句

還有沒有其他方式做更好的效率和查詢優化同樣的事情? EXPLAIN返回以下

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 PRIMARY  ch ref  customerid,customer_service_idx  customerid 4 const 13 Using where 
2 DEPENDENT SUBQUERY ii ref  chargeid chargeid 4 ch.chargeid  1 Using index 

回答

1

這是你可以寫:

SELECT ch.*, 
     (EXISTS (SELECT 1 FROM invoice_items ii WHERE ii.chargeid = ch.chargeid 
       ) 
     ) as billed 
FROM charges ch 
WHERE ch.customerid = %s AND ch.status <> 'completed'; 

它設置billed標誌,如果是在invoice_items表中的記錄。 MySQL將布爾值視爲整數,因此if是不必要的。 exists應該表現更好。爲獲得最佳性能,您需要索引:invoice_item(chargeid)charges(customerid, status)