Aggregate

如何改進我的查詢,使用連接和提高性能?

  • April 19, 2016

我有一個非常難聞的查詢,我不確定如何簡化,這是一個非常密集的查詢。我嘗試了各種聯合和內部連接以試圖簡化它,我最大的問題是解決以下錯誤:

SELECT 列表的表達式 #2 不在 GROUP BY 子句中,並且包含非聚合列

我下面的查詢解決了這個問題,但效率不高。

我想達到什麼目的?

刪除媒體項目後,我希望軟刪除與該媒體關聯的所有產品,前提是該產品沒有關聯任何其他媒體文件。

架構

+-----------+----------+
| entity_id | media_id |
+-----------+----------+
|       192 |        1 |
|       193 |        1 |
|       193 |        2 |
+-----------+----------+
  • 我有一個複合主鍵索引entity_idmedia_id
  • 我對entity_idproduct有外鍵約束
  • 我對media_idproduct_media有外鍵約束

當我刪除媒體*#1*時,我希望能夠更新 entity_id #192以設置deleted_at為目前時間戳。我不想更新 entity_id # 193,因為另一個媒體與之關聯。

UPDATE product
SET deleted_at = NOW()
WHERE id IN (
   SELECT entity_id
   FROM product_media
   WHERE media_id = ?
   AND entity_id NOT IN (
       SELECT entity_id
       FROM product_media
       GROUP BY entity_id HAVING COUNT(media_id) > 1
   )
)

如您所見,有兩個子查詢,我有 1 個子查詢的事實有點令人擔憂,但有兩個我知道我做錯了什麼,但我無法思考如何解決這個問題?

您有一個額外的不必要的子查詢檢查,並且您的子查詢似乎只返回一個行集,如果其中有一個值,所以您可能想要使用=而不是in. 你可以通過這樣做來達到同樣的目的:

UPDATE product
 SET deleted_at = NOW()
WHERE id = (
   SELECT entity_id
   FROM product_media
   WHERE media_id = ?
   GROUP BY entity_id
   HAVING COUNT(media_id) = 1
)

引用自:https://dba.stackexchange.com/questions/135638