问题
我有两张桌子:
Table tTag
idTag int
otherColumns
和
Table tTagWord
idTagWord int
idTag int
idWord int
position int
例如:
因此每个idTag都会有多个idTagWord(未知数字),这个位置也很重要。 我试图找到最好的方法,为了表现,找到重复的。
副本将是对于2个不同的idTag以相同的顺序(位置)具有相同的idWords。
我尝试了什么
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,因此它可以正常工作。但表现很糟糕。凭借150,000个idTag,它已经需要几分钟,桌子将很快拥有数百万的idTag。
我也试过这样的answer
select idTag, GROUP_CONCAT(idWord order by position ASC SEPARATOR '-') AS idWordSet
from tTagWord
group by idTag
Having COUNT(idWordSet) > 1;
但我似乎找不到办法。有什么想法吗?
答案 0 :(得分:3)
如何尝试两个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;
答案 1 :(得分:2)
这种类型的查询有时称为关系划分,https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/
有很多方法。一个例子是:
select
t1.idTag as tag1,
t2.IdTag as tag2
from
tTagWord t1
inner join
tTagWord t2
on t1.idWord = t2.idWord and
t1.position = t2.position and
t1.idTag < t2.idTag
group by
t1.idTag,
t2.idTag
having
count(*) = (
select
count(*)
from
tTagWord t3
where
t3.idTag = t1.idTag
) and
count(*) = (
select
count(*)
from
tTagWord t4
where
t4.idTag = t2.idTag
);
此处an example。我也在那里提出了戈登的问题。它们可能具有不同的性能特征。