[英]Subquery returns more rows than straight same query in MySQL
我想根據listings.product_id
和listings.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.