2012-09-12 69 views
0

我有一個名爲內容的表與以下字段:ID(鍵),標題,別名,狀態和命中。更新根據選擇查找重複和小於

有許多重複的記錄(不同的ID,但相同的標題和相同的別名)。 「狀態」字段控制記錄是發佈(1)還是未發佈(0)。

此刻我能取消發佈重複記錄:

UPDATE content 
SET content.state = 0 
WHERE content.alias IN 
(
    SELECT alias FROM 
    (
    SELECT `alias`, COUNT(*) `tot` 
    FROM `content` 
    GROUP BY `alias` 
    HAVING `tot` > 1 
) AS tmptable 
) 

但是這並沒有考慮到其中記錄有更大的「命中」。

我的目標是取消發佈帶有較小匹配的重複記錄。

回答

1

我建議這個查詢,而不是:

UPDATE content 
SET content.state = 0 
WHERE content.alias IN 
(
    SELECT DISTINCT c1.`alias` 
    FROM `content` c1, `content` c2 
    WHERE c1.`id` <> c2.`id` 
    AND c1.`alias` = c2.`alias` 
    AND c1.`hits` <= c2.`hits` 
) AS tmptable 

子查詢將選擇較小的命中重複的別名。

0
UPDATE content 
SET content.state = 0 
WHERE content.id NOT IN 
(
    SELECT DISTINCT a.id 
    FROM content AS a 
    LEFT JOIN content b ON b.alias = a.alias AND a.hits < b.hits 
    WHERE b.id IS NULL 
) 

編輯:幾乎像喬斯林寫的一樣。