免责声明:我正在使用带有2个表的MySQL。到目前为止,当我使用IN()一次查询单个组时,我已经找到了解决问题的方法,但是没有什么可以让我一次完成整个表而不循环多个查询。
我有两个表:
CREATE TABLE WordGroups (
wgId int NOT NULL AUTO_INCREMENT,
groupId int NOT NULL,
word varchar(255) NOT NULL,
PRIMARY KEY (wgId)
);
跟踪哪些关键字组,单词到groupId以及
CREATE TABLE ArticleWords (
awId int NOT NULL AUTO_INCREMENT,
articleId int NOT NULL,
word varchar(255) NOT NULL,
PRIMARY KEY (awId)
);
可跟踪文章中的关键字。
我正在尝试构建一个查询,以获取单词组,并为每个组返回包含至少所有这些单词的所有文章。
我意识到,如果我一次在单个查询中寻找一组,这非常简单,但是我似乎无法弄清楚如何在所有匹配子集的集合中进行单个查询。
例如,假设两个表具有以下数据:
单词组
groupId | word
-----------------
1 | B
1 | A
2 | C
2 | E
3 | F
ArticleWords
articleId | word
-----------------
1 | A
1 | C
1 | B
2 | C
3 | A
3 | B
3 | F
4 | C
4 | E
4 | F
结果查询将返回:
groupId | articleId
1 | 1
1 | 3
2 | 4
3 | 3
3 | 4
由于这些文章至少包含这些组中的所有单词。
我尝试使用内部联接对两个表进行相交,但是匹配不完整的单词组,从而导致该行:
groupId | articleId
2 | 2
所有出现在结果中的原因是第2条包含单词“ C”。当我涉足不太认真的MySQL时,我很乐于接受想法,但这整个星期都使我难以理解。
非常感谢您的帮助。我正想知道是否要使SQL进行本不应该做的事情。我有一个非常长的查询,适用于最多6个单词的WordGroup,但是它非常准确且不可扩展,该查询需要适用于任何大小的WordGroup才能实现。
感谢您的阅读!
答案 0 :(得分:0)
这是一种方法,使用group_concat()
进行比较:
select wg.groupId, aw.articleId
from articlewords aw join
wordgroups wg
on wg.word = aw.word join
(select wg.groupId, group_concat(wg.word order by word) as words
from word_groups wg
group by wg.groupId
) wgw
on wgw.groupId = wg.groupid
group by aw.articleid, wgw.words
having group_concat(aw.word order by aw.word) = wgw.words;
Here是一个SQL提琴。