2013-02-10 5 views
1

사이트 검색을 위해 쿼리를 작성하려고합니다. 이 쿼리로해야 할 일은 검색 키워드 (교사, 학원, 과목, 도시)에 따라 4 개의 기본 열을 선택하고 싶습니다. 키워드를 입력 할 때이 네 개의 테이블을 확인해야하며이 네 가지 범주 아래에 검색 결과를 표시해야합니다. 검색 결과를 표시 할 때 의미있는 검색 결과를 만들기 위해 일부 값을 추가해야합니다. 예 : 튜터를 튜터 카테고리 아래에 검색 결과로 표시 할 생각을하십시오. 이름, 도시, 프로필 이미지 등을 표시해야합니다.여러 테이블에서 효과적인 쿼리 만들기

이와 비슷한 내용입니다.

**Tutors** 
    tutor's name 
    city 
    profile image 
**institutes** 
    institute's name 
    city 
    profile image 
**subjects** 
    subject name 
    category name which belong this subject 
**cities** 
    city name 
    district name which city belong etc... 

나는 뭔가 약 50 %를이

$q = "SELECT keyword, col, city_name, image_name, tutor_code 
     FROM (
      SELECT tutor_name AS keyword, 'Tutors' AS col, IFNULL(c1.city_name, '') city_name, IFNULL(ti.image_name, '') image_name, tutor_code FROM tutors AS t 
      LEFT JOIN address a ON t.address_id = a.address_id 
      LEFT JOIN city c1 ON a.city_id = c1.city_id 
      LEFT JOIN tutor_images ti ON t.tutor_id = ti.tutor_id AND ti.image_type = 'profile' 
      UNION 
      SELECT subject_name AS keyword, 'Subject' AS col, '' city_name, '' image_name, '' tutor_code FROM subjects 
      UNION 
      SELECT city_name AS keyword, 'City' AS col, '' city_name, '' image_name, '' tutor_code FROM city 
      UNION 
      SELECT institute_name AS keyword, 'Institute' AS col, '' city_name, '' image_name, '' tutor_code FROM institutes AS i 
      LEFT JOIN address a ON i.address_id = a.address_id 
      LEFT JOIN city c2 ON a.city_id = c2.city_id 
      LEFT JOIN institute_images ii ON i.institute_id = ii.institute_id AND ii.image_type = 'profile'    
     ) s 
     WHERE keyword LIKE '%$queryString%' 
     LIMIT 10"; 

이 쿼리 작업을 같이하려고했지만 캔트 100 %에서 작동하도록. 문제는 기관명 범주 아래 도시 이름과 프로필 이미지를 표시하지 않으며 도시와 주제 필드 아래에 구역 이름과 범주 이름을 표시 할 수 없다는 것입니다. 또한 이런 종류의 질의에 비효율적이며 시간과 자원을 낭비하고 싶습니다.

감사합니다.

+0

구글 번역기 – shnisaka

+1

을 할 수 있습니다 [sqlfiddle] (http://sqlfiddle.com) 샘플 데이터와이? – Orangecrush

+0

sqlfiddle없이 솔루션을 얻을 수 있습니까? 그것의 열심히 나는 더 많은 테이블과 함께 일해야합니다. 응답을 위해 – TNK

답변

0

UNION은 모든 SELECT 쿼리의 결과를 한 세트의 열 이름/데이터 유형으로 된 하나의 큰 테이블에 넣으려고합니다. 따라서 모든 SELECT 문에 대한 각 열의 수와 데이터 유형이 일치해야합니다. 유형을 구분하는 유용한 전략 인 키워드를 이미 사용하고 있습니다. 나는 당신이이 작업을하기 위해 오른쪽 열의 여분의 데이터를 선택할 수 있다고 생각합니다.

나는 당신이해야 할 일은 그것을 시도하고 성능을 측정하는 것이라고 생각한다. 그런 다음 별도의 데이터베이스 호출을 병렬로 수행하고 결과를 얻고 성능을 측정하십시오. 나는 그들이 두 번째 이야기가 이해하고 유지하기가 훨씬 쉽다는 것에 비교 될 것이라고 생각한다.

+0

주셔서 감사합니다. 그러나 당신의 대답은 분명하지 않습니다. 그래서 예를 들어 설명해주십시오. 고맙습니다. – TNK

0

이 시도 :

SELECT keyword, col, city_name, image_name, tutor_code, district_name, category_name 
FROM (
    SELECT tutor_name AS keyword, 'Tutors' AS col, IFNULL(c1.city_name, '') city_name, 
      IFNULL(ti.image_name, '') image_name, tutor_code, '' district_name, '' category_name 
    FROM tutors AS t 
    LEFT JOIN address a ON t.address_id = a.address_id 
    LEFT JOIN city c1 ON a.city_id = c1.city_id 
    LEFT JOIN tutor_images ti ON t.tutor_id = ti.tutor_id AND ti.image_type = 'profile' 
    UNION 
    SELECT subject_name AS keyword, 'Subject' AS col, '' city_name, '' image_name, '' tutor_code, 
      '' district_name, c.category_name 
    FROM subjects s 
    LEFT JOIN category_subjects cs ON s.subject_id = cs.subject_id 
    LEFT JOIN category c ON cs.category_id = c.category_id 
    UNION 
    SELECT city_name AS keyword, 'City' AS col, '' city_name, '' image_name, '' tutor_code, 
      district_name, '' category_name 
    FROM city 
    UNION 
    SELECT institute_name AS keyword, 'Institute' AS col, IFNULL(c2.city_name, '') city_name, 
      IFNULL(ii.image_name, '') image_name, institute_code tutor_code, '' district_name, '' category_name 
    FROM institutes AS i 
    LEFT JOIN address a ON i.address_id = a.address_id 
    LEFT JOIN city c2 ON a.city_id = c2.city_id 
    LEFT JOIN institute_images ii ON i.institute_id = ii.institute_id AND ii.image_type = 'profile'    
) s 
WHERE keyword LIKE '%$queryString%' 
LIMIT 10 
+0

안녕하세요 @ 사하르 샤 다시 만나서 반갑습니다. 기다리십시오. – TNK

+0

내 category_name은 카테고리 테이블에서 왔고 category_subjects 테이블은 어떤 카테고리에 속해 있습니까? – TNK

+0

@TharangaNuwan 업데이트 된 답변을 확인하십시오 –

관련 문제