2011-02-08 6 views
4

mysql 쿼리에 문제가 있습니다.LEFT JOIN AND LIKE mysql을 사용합니다.

mysql> select username, specialty from users; 
+----------+------------------+ 
| username | specialty  | 
+----------+------------------+ 
| JinkX | php, html, mysql | 
| test1 | html    | 
+----------+------------------+ 


mysql> select name, tags from tasks; 
+----------------+------+ 
| name   | tags | 
+----------------+------+ 
| fix front page | html | 
+----------------+------+ 

그리고 난 다음 쿼리를 수행 할 때, 그것은 전문 정확히 태그와 동일한 경우에만 작동 : 내 테이블과 같은 방법 이있다. 하지만 난 당신이 잘못 like을하고있는 두

mysql> select tasks.name from users left join tasks on tasks.tags LIKE users.specialty where users.username = 'test1'; 
+----------------+ 
| name   | 
+----------------+ 
| fix front page | 
+----------------+ 

mysql> select tasks.name from users left join tasks on tasks.tags LIKE users.specialty where users.username = 'JinkX'; 
+------+ 
| name | 
+------+ 
| NULL | 
+------+ 
+1

스키마를 변경 (정규화) 하시겠습니까? –

+0

확실한 해결 방법은 무엇입니까? – saadlulu

+0

조 (Joe)의 대답에 따라 (정수 대용 키가있는 별도의'tags' 테이블을 가지고있을지라도) 이렇게하면 인덱스를 사용하여 쿼리를보다 효율적으로 수행 할 수 있습니다. 모든 사용자 레코드를 검사하지 않고도 –

답변

6

글쎄, 당신은 쉼표로 구분 된 문자열로 독립적 인 값을 저장하는 고통을 발견했습니다.

가능한 경우 데이터 구조를 변경하고 사용자 테이블에서 특수 열을 가져오고 외래 키가 users.usernametasks.tags 인 새 user_specialty 테이블을 만드는 것이 좋습니다.

+----------+------------------+ 
| username | tag    | 
+----------+------------------+ 
| JinkX | php    | 
| JinkX | html    | 
| JinkX | mysql   | 
| test1 | html    | 
+----------+------------------+ 
9

에서 작동합니다. 이것은 가장 방법이 아니다

select tasks.name 
from users left join tasks on users.specialty LIKE CONCAT('%',tasks.tags,'%') 
where users.username = 'JinkX' 

하지만

편집 작동합니다 :

이 쿼리를 시도해야 또 다른 방법이 의견에 따라 더 나은 정규 표현식을 사용하여

:

select tasks.name 
from users left join tasks on users.specialty REGEXP CONCAT('(^|,) ?',tasks.tags,' ?($|,)') 
where users.username = 'JinkX' 
+0

한 태그가 다른 태그의 하위 문자열 인 경우 여전히 작동하지 않습니다. –

+0

권장하지 않습니다. 한 태그가 다른 태그의 하위 집합 인 경우 거짓 일치가 발생할 수 있습니다. – awm

2

당신은 n find_in_set 기능을 사용하십시오. 당신의 where 절에이 넣어 :

FIND_IN_SET(task.tags,users.specialty) 

(Reference)

+0

그것에 대해 몰랐습니다! 그것은 올바른 방법이어야합니다. – Keeper

+0

어떤 형식입니까? 문서에서 개별 문자열을 구분해야하는 것처럼 보입니까? ''php ','html ','mysql ' –

+0

FIND_IN_SET은 문자열의 구분을 기대하지 않습니다. 쉼표 만 찾습니다. 공백을 없애지 않았는지 확실하지 않습니다. 그걸 확인해야 해. – awm