我有3列的組合索引。我想查找具有相同值的行的索引。這是我的索引:如何查找共享相同組合索引的行?
CREATE INDEX foobar ON tablename (foo, bar, asdf);
該索引不是唯一的。我創建它的想法是它可以幫助我找到在這3列(foo,bar,asdf)中共享相同值的行。
或者,我可以創建一個新的列,其值是3個其他列值的組合。但那是我唯一的選擇嗎?
我可以使用這個索引來獲得我想要的嗎?
我有3列的組合索引。我想查找具有相同值的行的索引。這是我的索引:如何查找共享相同組合索引的行?
CREATE INDEX foobar ON tablename (foo, bar, asdf);
該索引不是唯一的。我創建它的想法是它可以幫助我找到在這3列(foo,bar,asdf)中共享相同值的行。
或者,我可以創建一個新的列,其值是3個其他列值的組合。但那是我唯一的選擇嗎?
我可以使用這個索引來獲得我想要的嗎?
索引不用於對數據進行分組,但將其定位在表內。
如果你想找到它擁有共同的價值觀的項目,你會做的更好運行一個查詢,如
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;
您的索引會加快您希望所有那些三列特定值的行,如查詢:
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來完成它,但這不會很簡單。
因此,第一個選擇會讓您的項目具有倍數(不論存在多少倍數?)... – sqlman 2011-05-07 00:54:53
第一個查詢將列出每個唯一(foo,bar,asdf)三元組有多少行。所以例如'4 | 34 | x | 3'的結果表明3行存在foo = 4,bar = 34和asdf ='x',但不會告訴你關於這些行的其他信息。您將看到數據中每個三元組的結果,即使那些只有一個匹配行的結果也是如此。 – 2011-05-07 00:59:28