Mysql - 用单个字符串搜索多个关键字?

时间:2014-09-11 13:54:00

标签: mysql sql

我遇到了如何实现此搜索方法的问题。如何使用单个消息在表列中实现多个关键字?

我当前的SQL查询

SELECT *FROM rules WHERE keyword LIKE '%$message%'    

keyword的{​​{1}}列中的示例数据。 (包含多个逗号分隔关键字的字符串)

rules

示例消息

ASK, QUESTION

我怎么可能这样做?请指教。感谢。

2 个答案:

答案 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在这里小提琴: -

http://www.sqlfiddle.com/#!2/7678fa/2

相关问题