Aggregate
如何改進我的查詢,使用連接和提高性能?
我有一個非常難聞的查詢,我不確定如何簡化,這是一個非常密集的查詢。我嘗試了各種聯合和內部連接以試圖簡化它,我最大的問題是解決以下錯誤:
SELECT 列表的表達式 #2 不在 GROUP BY 子句中,並且包含非聚合列
我下面的查詢解決了這個問題,但效率不高。
我想達到什麼目的?
刪除媒體項目後,我希望軟刪除與該媒體關聯的所有產品,前提是該產品沒有關聯任何其他媒體文件。
架構
+-----------+----------+ | entity_id | media_id | +-----------+----------+ | 192 | 1 | | 193 | 1 | | 193 | 2 | +-----------+----------+
- 我有一個複合主鍵索引
entity_id
和media_id
- 我對
entity_id
錶product
有外鍵約束- 我對
media_id
錶product_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 )