问题

我有2张桌子:

Table tTag
idTag int
otherColumns




Table tTagWord
idTagWord int
idTag int
idWord int
position int


例如:



因此,每个idTag将具有多个idTagWord(未知数字),位置也很重要。
我尝试找到最佳的性能,以查找重复项。

对于两个不同的idTag,重复项将以相同的顺序(位置)具有相同的idWord。

我尝试过的

SELECT GROUP_CONCAT(DISTINCT tab.idTag SEPARATOR ',') INTO @idTagSet
FROM (  SELECT idTag,GROUP_CONCAT(idWord order by position ASC SEPARATOR ' ') AS Tag
        FROM tTagWord
        GROUP BY idTag) AS tab
INNER JOIN (SELECT idTag,GROUP_CONCAT(idWord order by position ASC SEPARATOR ' ') AS Tag
            FROM tTagWord
            GROUP BY idTag) AS tab2 ON tab.Tag = tab2.Tag
WHERE tab.idTag <> tab2.idTag;


上一个查询返回一组重复的idTag,因此可以正常工作。但是性能太差了。有了15万个idTag,它已经花费了几分钟,并且表很快就会有数百万个idTag。

我也尝试过这样的answer

select idTag, GROUP_CONCAT(idWord order by position ASC SEPARATOR '-') AS idWordSet
from tTagWord
group by idTag
Having COUNT(idWordSet) > 1;


但是我似乎找不到办法。任何想法?

最佳答案

尝试两个group by怎么样?

SELECT words, count(*), group_concat(idtag) as tags
FROM (SELECT idTag, GROUP_CONCAT(idWord order by position ASC SEPARATOR ' ') AS words
      FROM tTagWord
      GROUP BY idTag
     ) t
GROUP BY words
HAVING count(*) > 1;

09-11 20:25