【问题标题】:How to JOIN after GROUP BY using GROUP_CONCAT?如何使用 GROUP_CONCAT 在 GROUP BY 之后加入?
【发布时间】: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。

标签: mysql sql join group-by


【解决方案1】:

使用子查询:

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

【讨论】:

    【解决方案2】:

    GROUP_CONCAT() 不保证值的顺序,除非您使用ORDER BY。如果要匹配单词,则应使用ORDER BY

    很遗憾,您的句子没有用于排序的明显列。事实上,你的数据模型很好奇。

    我可能猜到您打算将 Phrase 用于此目的:

    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;
    

    如果你没有这样的列,你应该添加它。

    【讨论】:

    • 你是对的,Phrase,应该命名为phrase_numberORDER BY 的列。感谢您的提示。
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多