Mysql
MYSQL 通過 FULLTEXT 索引將不同表中的一列與另一列匹配
我目前有兩張不同的桌子。
第一個表有一個標題列表和與這些標題相關的 ID;第二個表是隨機標題列表。
我想知道的是,是否有辦法將表 2 中的所有標題與表 1 中最接近的匹配標題進行匹配。這可能嗎?
我試過了 :
SELECT title_table .*, random_titles.*, MATCH (title_table.title) AGAINST (random_titles.title) AS relevance FROM title_table ORDER BY `relevance` DESC
但這沒有用。
我知道我可以使用這個查詢,因為每個標題都用 PHP 放在表 2 中,但我已經在數據庫中有很多標題。
AGAINST()
只接受字元串文字或包含字元串的變數——優化器可以確定性地解析為常量。
AGAINST
接受一個要搜尋的字元串和一個可選的修飾符,指示要執行的搜尋類型。搜尋字元串必須是在查詢評估期間保持不變的字元串值。例如,這排除了表格列,因為每行可能不同。– http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html
這排除了我能想到的任何構造,在哪裡可以使用普通查詢來連接基於全文索引匹配的表。
…然而…
您可以將全文查詢包裝在儲存函式中:
DELIMITER $$ DROP FUNCTION IF EXISTS `best_fulltext_match` $$ CREATE FUNCTION `best_fulltext_match` (search_string TEXT) RETURNS INT DETERMINISTIC READS SQL DATA BEGIN RETURN (SELECT id FROM title_table WHERE MATCH(title) AGAINST(search_string) ORDER BY MATCH(title) AGAINST (search_string) DESC LIMIT 1); END $$ DELIMITER ;
現在…
SELECT best_fulltext_match('your title here');
…根據title_table中的全文索引返回最佳匹配的id,這個函式會接受一個變數,沒問題。
然後您可以使用它來更新您的 random_title_table。
UPDATE random_title SET title_id = best_fulltext_match(title);
該函式在 random_title 中每行呼叫一次,並為全文搜尋提供一個靜態值以進行搜尋。
在 random_title 中創建新條目時,您也可以使用相同的功能。
“最接近的匹配”約束讓我想到了 MySQL 函式SOUNDEX**。
我從未使用過此功能,但也許它是為您精心設計的 :)
最大限度。