【问题标题】:How to mark every non duplicate row in MySQL? (Merge Select and Update Statement)如何标记 MySQL 中的每个非重复行? (合并选择和更新语句)
【发布时间】:2011-08-12 02:38:55
【问题描述】:

我正在使用此查询来获取数据库中所有不重复的条目:

SELECT title, COUNT(title) as cnt
FROM my_table.books
GROUP BY title
HAVING cnt > 1
ORDER BY cnt;

我创建了一个tinyint(1) 类型的新列no_duplicate,我想在其中将每一行标记为1,这是唯一的(上面查询的每个输出)。

是否可以使用上面的查询嵌套更新?还是有更优雅的方式?

【问题讨论】:

  • 这是一次性的,还是您会经常运行此查询?
  • @mazzzzz:这将是一次性的事情。

标签: mysql select duplicates unique


【解决方案1】:

这样就可以了:

update books set
no_duplicate = 1;

update books set
no_duplicate = 0
where title in (select title from (
  SELECT title, COUNT(*) as cnt
  FROM books
  GROUP BY title
  HAVING COUNT(*) > 1) x);

为了提高效率,我分两步完成,因为它更有可能没有重复(合理的假设),WHERE title IN 列表会很小,因此很快。

【讨论】:

  • 这是正确的,只有近 100 万个条目中的 7000 个条目有重复项...非常感谢您的提示!
  • 如果将第二个COUNT(*)(在HAVING 后面)替换为cnt,会不会提高性能?
  • @Aufwind 可能,尽管解析器可能会这样做。但是,此解决方案将与任何 SQL 服务器一起运行(并非所有 SQL 风格都允许在 HAVING 子句中引用列别名)。肯定不会慢,既然你在mysql上,不妨也这样做吧。
【解决方案2】:

更新书籍
设置 no_duplicate = 1
where title in (select title from books group by title with count(*)

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2021-08-25
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多