Mysql 如何使用GROUP_CONCAT加入群后?
我有两张桌子Mysql 如何使用GROUP_CONCAT加入群后?,mysql,sql,join,group-by,Mysql,Sql,Join,Group By,我有两张桌子 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 (
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
我通过分组方式从文本表中获取短语
SELECT TRIM(GROUP_CONCAT(Word SEPARATOR ' ')) AS GroupedPhrase
FROM texts
WHERE Phrase IS NOT NULL GROUP BY TextID,SentenceID,Phrase
但是我需要连接
两个表以获得短语ID
,而不是短语
,一个查询来完成此操作:
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
使用子查询:
SELECT *
FROM (SELECT TextID,SentenceID,TRIM(GROUP_CONCAT(Word SEPARATOR ' ')) AS GroupedPhrase
FROM texts
WHERE Phrase IS NOT NULL
GROUP BY TextID,SentenceID,Phrase) sub
JOIN phrases b ON sub.GroupedPhrase=b.Phrase
GROUP_CONCAT()
不保证值的顺序,除非您使用ORDER BY
。如果要匹配单词,则应使用排序依据
不幸的是,您的句子没有一个明显的列用于排序。事实上,您的数据模型非常奇怪
我可能猜您打算将短语
用于此目的:
SELECT tsp.*, p.PhraseId
FROM (SELECT TextID, SentenceID,
GROUP_CONCAT(Word ORDER BY phrase SEPARATOR ' ')) AS GroupedPhrase
FROM texts
WHERE Phrase IS NOT NULL
GROUP BY TextID, SentenceID
) tsp JOIN
phrases p
ON tsp.GroupedPhrase = p.Phrase;
如果您没有这样的列,您应该将其添加进去。可能您的模式需要修改。
短语tinyint(3)unsigned
用于什么?连接大的varchar字符串不会有效。@MadhurBhaiya我应该修改命名,短语tinyint(3)unsigned
是每个语句ID
中的短语编号。我不理解数据结构。您已将textid
/sentenceid
定义为主键。例如,不需要通过
向分组添加短语
。事实上,根本不需要按两列进行聚合;我觉得您应该只在文本表中存储短语id。您是对的,短语
,应该命名为短语编号
是排序依据
的列。谢谢你的提示。