0

次のクエリが機能しない理由は、私の考えを完全に超えています。

DELETE orig FROM revision AS orig JOIN (
  SELECT id
  FROM revision 
  GROUP BY id 
  HAVING COUNT(*) > 1
) AS joined ON orig.id = joined.id
WHERE orig.id=1 
ORDER BY orig.delta ASC 
LIMIT 1

エラーは 8 行目でスローされるため、ORDER BY句. ただし、問題はありません (テーブルrevisionには という列がありますdelta)。さらに、に変更DELETE origするとSELECT *、コマンドが完全に機能します。

delta-column がロードされていない可能性はありますか? または、このエラーの原因は何ですか?


編集

ああ、クエリORDER BYで複数の行を使用できないことを知りませんでした。DELETE

さて、私が達成しようとしているのは、テーブル内の 1 つの行を削除することです。この行には、複数回発生する ID があり (本番環境では 5 になります)、その ID を持つすべての行の中で最も低いデルタがあります。

つまり、リビジョン テーブルに 2 つの行があり、どちらも同じ ID です。2 つのうちデルタが最も低い行を削除したいと思います。これはスケーラブルである必要があるため、(同じ ID を持つ) すべての行を削除しますが、1 つ (デルタが最大のもの) を削除します。

4

2 に答える 2

1

これがあなたがやろうとしていることだと思います。(id,delta)組み合わせに一意の制約がある場合にのみ、1 行のみが削除されます。

DELETE orig 
FROM revision AS orig 
  JOIN 
    ( SELECT MIN(delta) AS delta
      FROM revision 
      WHERE id = 1
      HAVING COUNT(*) > 1
    ) AS joined ON orig.delta = joined.delta
WHERE orig.id = 1 ;

id最高の行 (たとえば 5) を除くすべての行 (同じ) を削除するdeltaには、次を使用できます。

DELETE orig 
FROM revision AS orig 
  JOIN 
    ( SELECT delta
      FROM revision 
      WHERE id = 1
      ORDER BY delta DESC
      LIMIT 1 OFFSET 4                         -- select the 5th highest
    ) AS joined ON orig.delta < joined.delta   -- then find the lower than that
WHERE orig.id = 1 ;
于 2013-10-19T19:19:40.910 に答える