2009-08-09 3 views
1

PHP로 작업합니다. 나는 책이라는 이름의 테이블을 가지고있다. 표 책에는 책의 이름이 book_name이고 발행자의 ID가 book_publisher이고 저자의 ID가 book_author입니다. books 테이블 외에도 필자 이름과 ID가있는 books_author 테이블과 책 출판사 이름과 ID가있는 books_publisher 테이블이 있습니다.3 개의 테이블을 기반으로 한 MySQL 쿼리

나는 저자 이름, 책 이름 및 발행자 이름과 검색 버튼을 나타내는 3 개의 입력 필드를 제공합니다. 그들은 동일한 검색에서 저자 이름, 책 이름 및 발행인 이름을 입력 할 수 있으며 데이터베이스를 조회하고 저자 이름이 LIKE (% .. %) 인 책 이름을 반환해야합니다. 입력 된 저자 이름, 책 이름 LIKE 입력 된 책 이름 및 게시자 이름 LIKE 입력 한 게시자 이름.

문제는 저자의 ID와 발행인의 ID 만 내 책 테이블에 저장 했으므로 세 필드를 모두 검색하여 중복 (이름과 게시자가 일치하는 책)을 제외해야한다는 것입니다.

아무도이 쿼리를 작성하는 데 도움을 줄 수 있습니까? 경우에만, 말, 게시자 이름을 필터링 할 수있는 WHERE 절을 의미 동적으로 쿼리를 구성해야합니다 있도록 검색 상자는 선택이 상황에서 일반적으로

SELECT * 
FROM books b 
JOIN book_authors ba ON b.author_id = ba.id 
JOIN book_publishers bp ON b.publisher_id = bp.id 
WHERE b.book_name LIKE '...' 
AND ba.author_name LIKE '...' 
AND bp.publisher_name LIKE '...' 

:

답변

6

그냥 쿼리를 조인 사용자가 실제로 게시자 이름을 입력했습니다.

또한 LIKE '%blah%'에서 검색하는 것은 수천 또는 수만 곡을 초과하여 확장 할 수 없습니다. 인덱싱이 필요하지 않습니다. 대신 MySQL full-text searching과 같은 것을 사용하려고합니다.

마지막으로 입력 내용을 살균하십시오. 즉 입력 필드를 모두 mysql_real_escape_string()으로 전달하십시오.

+0

+1 전체 텍스트 검색 제안 용 – karim79

+0

스핑크스 검색으로 텍스트 필드를 인덱싱하는 것이 더 좋습니다. MySQL의 기본 제공 전체 텍스트 인덱싱, 형태소 분석을 지원하는 것보다 훨씬 빠름을 알고 있습니다. –

+0

감사합니다. –

관련 문제