我遇到了如何实现此搜索方法的问题。如何使用单个消息在表列中实现多个关键字?
我当前的SQL查询
SELECT *FROM rules WHERE keyword LIKE '%$message%'
表keyword
的{{1}}列中的示例数据。 (包含多个逗号分隔关键字的字符串)
rules
示例消息
ASK, QUESTION
我怎么可能这样做?请指教。感谢。
答案 0 :(得分:1)
在MySQL中拆分逗号分隔的字符串并不容易 - 你必须编写一个带有循环的存储过程。
相反,请考虑规范化rules
表,其中每个关键字位于不同的行中:
CREATE TABLE rule_keywords (
rule_id INT,
keyword VARCHAR(30),
UNIQUE INDEX (keyword, rule_id)
);
此查询会告诉您任何关键字与消息匹配的所有规则。
SELECT DISTINCT rule_id
FROM rule_keywords
WHERE '$message' LIKE CONCAT('%', keyword, '%');
如果您想查找**所有*关键字匹配的规则,您可以执行以下操作:
SELECT rule_id, SUM('$message' LIKE CONCAT('%', keyword, '%')) AS num_matches,
COUNT(*) AS num_keywords
FROM rule_keywords
HAVING num_matches = num_keywords
在任何一种情况下,您都可以将其与rules
表连接,以获取有关匹配规则的其他信息。
答案 1 :(得分:0)
我完全支持Barmars关于规范表格的建议。
然而,使用相对简单的测试数据,可以做到你想要的(尽管可能不可取),假设单词在单个查询中用常量(例如空格)分隔。
以下内容可以处理最多100个单词的搜索短语。
SELECT rules_id, COUNT(*) AS keyword_match_count, GROUP_CONCAT(message_word)
FROM rules
INNER JOIN
(
SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(message, ' ', anInt), ' ', -1) AS message_word
FROM
(
SELECT 'I want to ask and question for this thing' AS message
) sub1
CROSS JOIN
(
SELECT units.i + tens.i * 10 + 1 AS anInt
FROM
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units,
(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
) sub2
) sub3
ON FIND_IN_SET(message_word, rules.keyword)
GROUP BY rules_id
ORDER BY keyword_match_count DESC
SQL在这里小提琴: -