簡體   English   中英

子查詢比 MySQL 中的直接相同查詢返回更多行

[英]Subquery returns more rows than straight same query in MySQL

我想根據listings.product_idlistings.channel_listing_id的組合刪除重復項

這個簡單的查詢返回 400.000 行(我想保留的行的 ID):

SELECT  id
    FROM  `listings`
    WHERE  is_verified = 0
    GROUP BY  product_id, channel_listing_id 

雖然此變體返回 1.600.000 行,這些行都是表中的記錄,但不僅是 is_verified = 0:

SELECT  *
    FROM (
        SELECT  id
            FROM  `listings`
            WHERE  is_verified = 0
            GROUP BY  product_id, channel_listing_id
         ) AS keepem 

我希望他們返回相同數量的行。 這是什么原因? 我怎樣才能避免它(為了在 DELETE 語句的 where 條件中使用子選擇)?

編輯:我發現在外部SELECT中執行SELECT DISTINCT “修復”它(它應該返回 400.000 條記錄)。 我仍然不確定我是否應該信任這個子查詢,因為DELETE語句中沒有DISTINCT

編輯 2:似乎只是 phpMyAdmin 報告行總數的方式中的一個錯誤。

您的查詢不明確。 假設您有兩個具有相同 product_id 和 channel_id 的列表。 那么應該返回什么id 第一個,第二個? 或者兩者兼而有之,忽略 GROUP 請求?

如果有多個具有不同產品和渠道 ID 的 ID 怎么辦?

嘗試通過選擇MAX(id) AS id並添加 DISTINCT 來消除歧義。

有沒有需要擔心的外鍵? 如果沒有,您可以將原始表格倒入副本中,清空原始表格並僅將非重復項復制回其中。 Messier,但您只能執行 SELECT 或 DELETE 保證成功的操作,並且您還可以保留備份。

分配別名以避免字段引用歧義:

SELECT 
    keepem.*
FROM
    (
    SELECT 
        innerStat.id
    FROM
        `listings` AS innerStat
    WHERE
        innerStat.is_verified = 0
    GROUP BY
        innerStat.product_id,
        innerStat.channel_listing_id
) AS keepem

暫無
暫無

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

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