У меня две таблицы, с данными, заполненными в этом sqlFiddle
прямо сейчас, у меня есть запрос, который выглядит как ниже, когда я ищу «George Tabuki Street Fighter Miley Cyrus», у меня есть php, explode
строку поиска и динамически строить запрос, добавив + CASE WHEN ... END
SELECT id,word,LEFT(description,100)as description, IFNULL((SELECT sum(vote) FROM vote v WHERE v.definition_id = d.id),0) as votecount, 0 + CASE WHEN LOCATE('George',CONCAT(word,description,`usage`))>0 THEN 1 ELSE 0 END + CASE WHEN LOCATE('Tabuki',CONCAT(word,description,`usage`))>0 THEN 1 ELSE 0 END + CASE WHEN LOCATE('Street',CONCAT(word,description,`usage`))>0 THEN 1 ELSE 0 END + CASE WHEN LOCATE('Fighter',CONCAT(word,description,`usage`))>0 THEN 1 ELSE 0 END + CASE WHEN LOCATE('Miley',CONCAT(word,description,`usage`))>0 THEN 1 ELSE 0 END + CASE WHEN LOCATE('Cyrus',CONCAT(word,description,`usage`))>0 THEN 1 ELSE 0 END as `match` FROM definition d HAVING `match` > 0 ORDER BY `match` DESC,votecount DESC
Вышеуказанный запрос возвращает именно то, что я хочу.
Вопрос: есть ли лучший способ, или есть функция в mySQL, которая возвращает количество совпадающих слов?
Я нашел лучший способ, но не лучший способ, но он возвращает количество случаев совпадения терминов
SELECT id,word,LEFT(description,100)as description, IFNULL((SELECT sum(vote) FROM vote v WHERE v.definition_id = d.id),0) as votecount, 0 + IFNULL(ROUND((LENGTH(CONCAT(word,description,`usage`,`by`)) - LENGTH(REPLACE(CONCAT(word,description,`usage`,`by`), 'George', '')))/LENGTH('George')),0) + IFNULL(ROUND((LENGTH(CONCAT(word,description,`usage`,`by`)) - LENGTH(REPLACE(CONCAT(word,description,`usage`,`by`), 'Tabuki', '')))/LENGTH('Tabuki')),0) + IFNULL(ROUND((LENGTH(CONCAT(word,description,`usage`,`by`)) - LENGTH(REPLACE(CONCAT(word,description,`usage`,`by`), 'Street', '')))/LENGTH('Street')),0) + IFNULL(ROUND((LENGTH(CONCAT(word,description,`usage`,`by`)) - LENGTH(REPLACE(CONCAT(word,description,`usage`,`by`), 'Fighter', '')))/LENGTH('Fighter')),0) + IFNULL(ROUND((LENGTH(CONCAT(word,description,`usage`,`by`)) - LENGTH(REPLACE(CONCAT(word,description,`usage`,`by`), 'Miley', '')))/LENGTH('Miley')),0) + IFNULL(ROUND((LENGTH(CONCAT(word,description,`usage`,`by`)) - LENGTH(REPLACE(CONCAT(word,description,`usage`,`by`), 'Cyrus', '')))/LENGTH('Cyrus')),0) as `match` FROM definition d HAVING `match` > 0 ORDER BY `match` DESC,votecount DESC;