这对于大表来说是一种昂贵的方法,假设word 不为空,我们可以这样做:
SET group_concat_max_len = 16777216 ;
SELECT t.song_serial
, t.house_number
, t.row_number
FROM mytable t
GROUP
BY t.songserial
, t.house_number
, t.row_number
HAVING CONCAT(' ',GROUP_CONCAT(t.word ORDER BY t.word_position_by_row),' ')
LIKE CONCAT('% ','I love you',' %')
我们肯定想要一个合适的可用索引,例如
... ON `mytable` (`songserial`,`house_number`,`row_number`,`word`)
如果短语中的某个词不常用,我们可以先通过搜索该不常用词来优化一点,然后在同一行中获取所有词...
SELECT t.song_serial
, t.house_number
, t.row_number
FROM ( SELECT r.songserial
, r.house_number
, r.row_number
FROM mytable r
WHERE r.word = 'love'
GROUP
BY r.word
, r.songserial
, r.house_number
, r.row_number
) s
JOIN mytable t
ON t.songserial = s.songserial
AND t.house_number = s.house_number
AND t.row_number = s.row_number
GROUP
BY t.songserial
, t.house_number
, t.row_number
HAVING CONCAT(' ',GROUP_CONCAT(t.word ORDER BY t.word_position_by_row),' ')
LIKE CONCAT('% ','I love you',' %')
内联视图 s 将受益于以 word 作为前导列的覆盖索引
... ON `mytable` (`word`,`songserial`,`house_number`,`row_number`)