2011-05-07 66 views
1

我有3列的組合索引。我想查找具有相同值的行的索引。這是我的索引:如何查找共享相同組合索引的行?

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

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

或者,我可以創建一個新的列,其值是3個其他列值的組合。但那是我唯一的選擇嗎?

我可以使用這個索引來獲得我想要的嗎?

回答

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; 
+0

因此,第一個選擇會讓您的項目具有倍數(不論存在多少倍數?)... – sqlman 2011-05-07 00:54:53

+0

第一個查詢將列出每個唯一(foo,bar,asdf)三元組有多少行。所以例如'4 | 34 | x | 3'的結果表明3行存在foo = 4,bar = 34和asdf ='x',但不會告訴你關於這些行的其他信息。您將看到數據中每個三元組的結果,即使那些只有一個匹配行的結果也是如此。 – 2011-05-07 00:59:28

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來完成它,但這不會很簡單。

+0

我想查找這3列具有相同值的行。 (這些行是重複的小部件,可以這麼說,但它們在其他列中確實存在差異。)然後,我想要將這些行上的計算作爲單獨的組進行。例如,我想總結這些行的某一列或找出哪一行在另一列(不是3列中的一列)中最長的字符串,等等。 – sqlman 2011-05-07 02:17:50

+0

好的,謝謝,我會嘗試 – sqlman 2011-05-07 03:26:30