【发布时间】:2019-10-05 15:36:42
【问题描述】:
我有两张桌子
CREATE TABLE texts
(
TextID int(11) unsigned,
SentenceID int(11) unsigned,
Phrase tinyint(3) unsigned,
Word varchar(255),
PRIMARY KEY(TextID,SentenceID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci
CREATE TABLE phrases
(
PhraseID int(11) unsigned NOT NULL AUTO_INCREMENT,
Phrase varchar(255),
PRIMARY KEY(PhraseID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci
我从 GROUP BY 的文本表中获取短语,
SELECT TRIM(GROUP_CONCAT(Word SEPARATOR ' ')) AS GroupedPhrase
FROM texts
WHERE Phrase IS NOT NULL GROUP BY TextID,SentenceID,Phrase
但我需要JOIN 两个表来获取PhraseID 而不是Phrase,执行此操作的查询:
SELECT a.TextID,a.SentenceID,b.PhraseID
FROM texts a JOIN phrases b ON TRIM(GROUP_CONCAT(a.Word SEPARATOR ' '))=b.Phrase
WHERE a.Phrase IS NOT NULL GROUP BY a.TextID,a.SentenceID,a.Phrase
【问题讨论】:
-
也许您的架构需要修改。
Phrase tinyint(3) unsigned是什么?加入大型 varchar 字符串效率不高。 -
@MadhurBhaiya 我应该修改命名,
Phrase tinyint(3) unsigned是每个SentenceID中的phrase number。 -
我不懂数据结构。您已将
textid/sentenceid定义为主键。例如,无需将phrase添加到group by。事实上,根本不需要按两列聚合。 -
除非两个表之间的短语不匹配;我觉得你应该只在文本表中存储phrase_id。