2009-08-19 5 views
0

데이터베이스에 두 개의 테이블이 있습니다. 다른 하나는 B 입니다. A는 3 개가 id, name, group 인 필드가 거의 없습니다. B는 id, title, 설명 등mysql에서 두 테이블의 데이터를 마찬가지로 찾습니다.

난 표 A의 이름이나 그룹 유사한 데이터가있는 제목 및 설명의 ID의 검색 다음 표 A. 예

필드에서의 id를 삽입 가져야 A가 그 이름에 'Anna'를, 그 그룹에 'girl'이 있으면 표 B의 제목과 설명을 'Anna'또는 'Girl'이라는 단어가 포함 된 이름으로 검색해야합니다.

하나의 쿼리에서이 작업을 수행하려고합니다.

어떻게하면됩니까?

편집 : 더 나은 이해

table A 

id  name  group  matched_id 
1  anna  girl 
2  sydney girl 
3  max  boy        etc. 

Table B 

id  title          description 
1  A good girl        Anna is a very good girl 
2  Max doesnt work hard     Boys are always like that only 

등 여기 내 테이블을 explainng 스피 ...

내가 먼저 테이블 B의 제목과 설명에 '애나'의 일치를 검색합니다 참조 만약 그들 중 어느 하나에서 일치하는 것이 발견된다면 나는 그 ID를 테이블 '일치하는 ID'필드에만 저장합니다. '여자'와 '시드니'에 대해 동일한 절차를 수행합니다.

+0

올바르게 이해하면 B.id를 표 A의 새/나열되지 않은 입력란에 삽입 하시겠습니까? – FrankS

+0

문제가 여전히 남아 있습니다. 일치하는 항목을 발견하면 ID를 어디에 넣으시겠습니까? 일치하는 ID가 두 개 이상 발견되면 어떻게됩니까? (그룹을 위해 쉽게 일어날 것이다). – FrankS

답변

0

트릭 어떻게해야이 쿼리 :

UPDATE a SET matched_id = 
(SELECT b.id FROM b 
    WHERE b.title LIKE CONCAT(' % ',a.name,' % ') 
    OR b.description LIKE CONCAT('% ',a.name,' %') 
    OR b.title LIKE CONCAT('%',a.group,'%') 
    OR b.description LIKE CONCAT('%',a.group,'%') 
    LIMIT 1) 
WHERE EXISTS 
(SELECT a.id FROM b 
    WHERE b.title LIKE CONCAT('% ',a.name,' %') 
    OR b.description LIKE CONCAT('% ',a.name,' %') 
    OR b.title LIKE CONCAT('%',a.group,'%') 
    OR b.description LIKE CONCAT('%',a.group,'%') 
    LIMIT 1) 
을 이것에

일부 발언 :

  • LIMIT 1 각 하위 쿼리가 더 그쪽을 반환합니다 수, 필요했다 n 1 행
  • 원하는/필요한 주문을 사용하는 경우 100 % 확신 할 수 없으므로 필요에 따라 더 많은 테스트를 거쳐야합니다.
  • 그룹에 추가 테이블을 사용하는 것이 더 나을 수도 있습니다 을 이름이 (여자/여자 달리) 완벽하게 일치해야하는 경우, 당신은 할 수 있습니다 당신은

편집에 B의 모든 결과를 매핑 할 수 있도록, 어쩌면 하나 개의 별도의 매핑 테이블을 (중복 된 항목을 줄이기 위해) 및 '%', a.name, '%'와 같이 이름 앞에 공백을 추가하십시오. 더 복잡한 경우 정규식 (REGEX)을 사용하는 것이 좋습니다. 공백 (이름 만)을 사용하여 쿼리를 수정 했으므로 다시 사용해보십시오.

+0

당신의 질의가 거의 완료되었지만 이제 문제는 'LT'와 같은 이름이 있다면 정확한 'LT'가 쓰여지지 않은 그 제목/desc조차도 일치를 제공한다는 것입니다. 예를 들어. 나는 상담하고있다. 이 쿼리는 컨설팅에있어 LT와 일치합니다. 정확하게 단어와 일치시키고 싶습니다. "i와 LT가 함께 갔다"와 같은 문장에만 일치해야합니다. – developer

+0

이제 문제가 해결 되었습니까? – FrankS

+0

다른 OR를 추가해도 문제가되지 않아야합니다. 당신 자신의 간단한 수정을 추가 할 수 없다는 것은 약간 슬픈 일입니다.이 쿼리는 당신이 질문에 지정한 당신의 요구에 맞아야하며 새로운 요구에 쉽게 적용 할 수 있습니다. 복잡한, 체크 REGEX. – FrankS

0
SELECT * 
FROM A 
JOIN B 
ON  b.title IN (a.name, a.group) 
     OR b.description IN (a.name, a.group) 
WHERE a.name = 'Anna' 
     AND a.group = 'girl' 

INDEX_UNION 이후 년대는 (테이블이 InnoDB을 특히 경우) 쿼리를 분할하는 것이 더있을 수 있습니다, MySQL 매우 효율적이지 :

SELECT * 
FROM (
     SELECT b.id 
     FROM A 
     JOIN B 
     ON  b.title IN (a.name, a.group) 
     WHERE a.name = 'Anna' 
       AND a.group = 'girl' 
     UNION 
     SELECT b.id 
     FROM A 
     JOIN B 
     ON  b.description IN (a.name, a.group) 
     WHERE a.name = 'Anna' 
       AND a.group = 'girl' 
     ) bo 
JOIN B 
ON  b.id = bo.id 
관련 문제