Как присоединиться после GROUP BY, используя GROUP_CONCAT? - PullRequest
1 голос
/ 05 октября 2019

У меня есть две таблицы как

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

Ответы [ 2 ]

1 голос
/ 05 октября 2019

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;

Если у вас нет такого столбца, вы должны добавить его в.

1 голос
/ 05 октября 2019

Использование подзапроса:

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
...