簡體   English   中英

MySQL Join並排除count = 0的行

[英]MySQL Join and excluding rows with count=0

我有以下簡單查詢,它是垃圾回收腳本的一部分。 該腳本應刪除未使用的購物車。 超過24小時前更新的購物車尚未使用,並且未附加到訂單或用戶。

        $query = "SELECT comm_cart.id AS `cart_id`, (" . time() . " - comm_cart.update_date) AS `diff`, COUNT(comm_orders.cart_id) AS `c1`, COUNT(comm_users.cart_id) AS `c2` " .
             "FROM `comm_cart` " . 
             "LEFT JOIN `comm_orders` ON comm_cart.id=comm_orders.cart_id " . 
             "LEFT JOIN `comm_users` ON comm_cart.id=comm_users.cart_id " . 
             "GROUP BY comm_cart.id "; 
             "HAVING `diff`>86400 AND `c1`=0 AND `c2`=0"; 

該查詢找到了太多的購物車:它還標記了c1> 0或c2> 0的購物車,我不知道為什么。 有什么線索嗎?

我懷疑您正在沿着兩個不同的維度加入。 簡單的解決方法是使用distinct

SELECT comm_cart.id AS `cart_id`, (" . time() . " - comm_cart.update_date) AS `diff`, 
       COUNT(DISTINCT comm_orders.cart_id) AS `c1`, COUNT(DISTINCT comm_users.cart_id) AS `c2` " .

更好的解決方案是針對這兩個條件使用not exists

FROM comm_carts cc
WHERE not exists (select 1 from comm_orders co where cc.id = co.cart_id )
      not exists (select 1 from comm_users cu where cc.id = cu.cart_id )

您甚至不需要在可能起作用的奇跡所在的情況下進行分組,當然,我建議使用Gordon關於不存在的建議,但是如果您希望進行最小的更改,那就是。

SELECT
    comm_cart.id AS `cart_id`,
    (UNIX_TIMESTAMP() - comm_cart.update_date) AS `diff`
FROM `comm_cart`
LEFT JOIN `comm_orders`
  ON comm_cart.id=comm_orders.cart_id
LEFT JOIN `comm_users`
  ON comm_cart.id=comm_users.cart_id
WHERE
  comm_orders.cart_id IS NULL
  AND
  comm_users.cart_id IS NULL

哦,我已經使用UNIX_TIMESTAMP()代替了PHP時間函數,效果相同,但是這避免了將PHP和SQL混合使用。

如果您只想獲取c1 = 0和c2 = 0的數據,則需要編寫一個where條件,而不是使用group by之前,

$query = "SELECT comm_cart.id AS `cart_id`, (" . time() . " - comm_cart.update_date) AS   `diff`, COUNT(comm_orders.cart_id) AS `c1`, COUNT(comm_users.cart_id) AS `c2` " .
         "FROM `comm_cart` " . 
         "LEFT JOIN `comm_orders` ON comm_cart.id=comm_orders.cart_id " . 
         "LEFT JOIN `comm_users` ON comm_cart.id=comm_users.cart_id " . 
         " where c1=0 and c2 =0 and diff >86400 GROUP BY comm_cart.id;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM