0

次のフィールドを持つ content という名前のテーブルがあります: 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
)

ただし、これは、どのレコードの「ヒット数」が多いかを考慮していません。

私の目標は、ヒット数の少ない重複レコードを非公開にすることです。

4

2 に答える 2

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

サブクエリは、ヒット数が少ない重複したエイリアスを選択します。

于 2012-09-12T15:07:45.930 に答える
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
)

編集:ジョセリンが書いたのとほぼ同じです。

于 2012-09-12T15:20:34.203 に答える