2014-09-11 3 views
1

이 검색 방법을 구현하는 방법에 문제가 있습니다. 하나의 메시지로 여러 개의 키워드를 구현하는 방법 테이블 rules에 대한 keyword 열 내부Mysql - 단일 문자열로 여러 키워드 검색?

나의 현재 SQL 쿼리는

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

샘플 데이터입니다. (여러 개의 쉼표가 키워드를 분리 한 문자열)

ASK, QUESTION 

샘플 메시지

I want to ask and question for this thing 

내가 어떻게 가능 할까? 제발 조언. 감사.

+0

전체 텍스트 인덱싱을 사용하는 것이 좋습니다. –

+0

키워드 열은 여러 개의 쉼표로 구분 된 키워드가있는 문자열입니까? 또는 2 개의 다른 행에서 2 개의 보이는 키워드입니까? – Thomas

+0

예. 여러 개의 쉼표로 구분 된 키워드가있는 문자열 –

답변

1

MySQL에서 쉼표로 구분 된 문자열을 분할하는 것은 쉽지 않습니다. 루프가있는 저장 프로 시저를 작성해야합니다.

대신은, 다른 행에 각 키워드의 rules 테이블을 정상화 고려 :

CREATE TABLE rule_keywords (
    rule_id INT, 
    keyword VARCHAR(30), 
    UNIQUE INDEX (keyword, rule_id) 
); 

이 쿼리는 당신에게 키워드 어떤 메시지를 일치하는 모든 규칙을 알려드립니다. 다른 얻으려면, 당신은 다음 rules 테이블이 가입하실 수 있습니다

SELECT rule_id, SUM('$message' LIKE CONCAT('%', keyword, '%')) AS num_matches, 
       COUNT(*) AS num_keywords 
FROM rule_keywords 
HAVING num_matches = num_keywords 

를 두 경우 :

SELECT DISTINCT rule_id 
FROM rule_keywords 
WHERE '$message' LIKE CONCAT('%', keyword, '%'); 

당신이 ** * 키워드 일치 모두가 당신이 할 수있는 규칙을 찾으려면

일치 된 규칙에 대한 정보

+0

정확히 내 의견을 염두에두고 있던 내용이었습니다 ^^.이 경우에도 규칙을 원하기 때문에 필요한 규칙이있는 조인이됩니다. – Thomas

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

관련 문제