如何查找共享相同组合索引的行?

时间:2011-05-07 00:00:16

标签: mysql sql database-design indexing

我有3列的组合索引。我想找到这个索引具有相同值的行。这是我的索引:

CREATE INDEX foobar ON tablename (foo, bar, asdf);

索引不是唯一的。我创建它的想法是,它可以帮助我找到在这3列(foo,bar,asdf)中共享相同值的行。

或者,我可以创建一个新列,其值是其他3个列值的组合。但这是我唯一的选择吗?

我可以将此索引用于我想要的内容吗?

2 个答案:

答案 0 :(得分:2)

索引不用于分组数据,但可以在表格中找到它。

如果您希望查找具有共同值的项目,最好运行查询,例如

  SELECT foo, bar, asdf, SUM(1) as counter 
    FROM mytable 
GROUP BY foo, bar, asdf 

这将显示具有倍数的项目,您可以执行更长的查询器来推断具有计数器的查询> 1然后获取它的值:

  SELECT t.foo, t.bar, t.asdf, SUM(1) as counter 
    FROM mytable AS t
GROUP BY t.foo, t.bar, t.asdf 
  HAVING counter > 1;

答案 1 :(得分:0)

您的索引会加速查询,您希望所有行都包含这三列的特定值,例如:

SELECT * FROM tablename WHERE foo = 1 AND bar = 2 AND asdf = 3

我不确定,但它也可能有助于对结果进行排序以使匹配行相邻的查询,如下所示:

SELECT * FROM tablename WHERE somecondition ORDER BY foo, bar, asdf;

根据您的评论,您似乎想要这样的内容:

SELECT GROUP_CONCAT(id SEPARATOR ',') as ids, foo, bar, asdf, COUNT(*) as cnt FROM tablename GROUP BY foo, bar, asdf HAVING cnt > 1;

这将告诉您哪些行是重复的,您可以从那里检查您需要的各个组。如果你想用一个查询做所有事情,你可以使用一些较重的SQL来做,但这并不简单。