반응형
2 개의 테이블이 있습니다.
태그 테이블은 다음과 같이 구성됩니다.
따라서 게시물에 지정된 모든 태그에 대해 tags 테이블에 레코드를 만듭니다. 게시물에 10 개의 태그가있는 경우 해당 post_id와 함께 태그 테이블에 10 개의 레코드가 있습니다.
이제 사용자가 태그에 지정된 키워드가 포함되지 않은 게시물을 검색 할 수있는 검색 페이지를 구축하려고합니다. 그래도 문제가 발생합니다. 다음과 같은 쿼리 :
SELECT DISTINCT posts.id, posts.title, posts.content
FROM jobs, tags
WHERE tags.tag NOT LIKE '%$keywords%' AND posts.id=tags.post_id
게시물에 6 개의 태그가 있고 그중 하나에 키워드가있는 경우 태그 테이블의 다른 5 개 레코드에는 해당 키워드가 없기 때문에 여전히 반환됩니다.
이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 검색에만 사용되는 모든 쉼표로 구분 된 태그를 저장하는 posts 테이블에 새 열을 만드는 것 외에 다른 방법이 있습니까 ??
해결 방법
인덱스가 있는지 확인하십시오. 그렇지 않으면 성능이 매우 나빠질 것입니다.
SELECT posts.id, posts.title, posts.content
FROM posts
WHERE NOT EXISTS (
SELECT post_id from tags
WHERE tags.tag LIKE '%$keywords%'
AND posts.id=tags.post_id
)
지정한 태그와 일치하는 태그가있는 게시물을 제외한 모든 게시물의 목록을 가져옵니다. (귀하의 원래 쿼리는 'jobs'테이블을 참조했습니다. 'posts'에 대한 오타라고 가정했습니다.)
SELECT p.id, p.title, p.content
FROM posts p
WHERE NOT EXISTS (
SELECT t.post_id from tags t
WHERE t.tag LIKE '%$keywords%'
AND p.id=t.post_id
)
그런 다음 다음 인덱스를 만듭니다.
Posts: id, tag_id
Tags: post_id, tag
참조 페이지 https://stackoverflow.com/questions/500790
반응형
'MySql' 카테고리의 다른 글
MySQL 8.0.11이 설치된 Laravel 5.5 : 'sql_mode'를 'NO_AUTO_CREATE_USER'값으로 설정할 수 없습니다. (0) | 2020.10.19 |
---|---|
MySQL 기본 테이블의 값을 기반으로 다른 테이블에서 두 개의 추가 열을 선택하는 방법은 무엇입니까? (0) | 2020.10.19 |
MySQL mysql 및 hsqldb에서 호환되는 TEXT 필드 (0) | 2020.10.18 |
MySQL JSON 데이터 유형을 허용하지 않는 MYSQL (0) | 2020.10.18 |
MySQL MySql에서 악센트 구분 검색을 수행하는 방법 (0) | 2020.10.18 |
댓글