온라인 라이브러리 검색 엔진에서 작업하고 있지만 여기에 붙어 있습니다. 태그를 검색 할 때 OR 검색 (예 : "tag1"OR "tag2"가 포함 된 책)은 정상적으로 작동하지만 AND 검색을 사용하면 문제가 발생합니다.MySQL이 모든 태그가있는 항목을 검색했습니다.
나는이에 사용하는 테이블 (및 열)입니다 : 다른 검색 옵션의 무리가 EN/사용자가 사용할 수 있기 때문에
books | book_id, other_info
tagmap | map_id, book_id, tag_id
tags | tag_id, tag_text
쿼리는 PHP에 의해 생성됩니다. 태그 "이 tag1"AND "이 tag2"책을 검색 할 때, 다음 쿼리가 생성됩니다
SELECT DISTINCT b.book_id, b.other_info
FROM books b, tagmap tm, tags t
WHERE b.book_id = "NA"
OR ((t.tag_text IN ("tag1", "tag2"))
AND tm.tag_id = t.tag_id
AND b.book_id = tm.book_id)
HAVING COUNT(tm.book_id)=2
를 Where 추가 매개 변수에 중독 될 수 있도록 (어떤 결과를 제공하지 않는 것은)이 라인 쿼리를보다 쉽게 나는 이것이 훨씬 더 멋지게 처리 될 수 있다는 것을 알고 있지만, 지금은 상관 없습니다.
동일한 검색어이지만 HAVING COUNT 행이없는 OR 검색을 수행하면 데이터베이스에 두 태그 중 하나가있는 두 권의 책이 반환되지만 두 태그가 모두있는 데이터베이스에서 한 도서를 검색 할 때, 아무것도 반환하지 않습니다.
검색어가 잘못되었습니다. 이것이/할 방법이 아닌가? 나는 무엇을 간과하고 있는가?
감사합니다.
편집은 : 요청에 따라, 책에 관한 각 테이블의 데이터가 반환해야한다 :
books table:
book_id 110
tagmap table:
book_id 110 110
tag_id 15 16
tags table:
tag_id 15 16
tag_text tag1 tag2
해결 : 내가해야 할 일을했을 모든이었다 포함
GROUP BY b.book_id
전 HAVING COUNT 행. 그처럼 간단합니다. taz가 제공 한 답은 특히 검색 쿼리를 최적화하려는 경우에 유용합니다.
당신은 테이블에서 데이터를 게시 할 수해야 표시하고 있습니까? – taz
또한 쉼표로 구분 된 테이블 이름 목록 대신 내부 조인을 사용해야합니다. 실수를하기 쉽고 때로는리스트 문법으로 큰 데카르트 곱을 계산하는 것이 쉽습니다! – taz
표시되는 유일한 정보는 책에 대한 기타 정보입니다.이 정보는 other_info 열에 요약되어 있습니다. 또는 쿼리 실행과 관련된 모든 데이터를 의미합니까? – Fang