1

サイト検索用のクエリを作成しようとしています。このクエリで行う必要があるのは、検索キーワード (チューター、研究所、科目、都市) に従って 4 つの主要な列を選択することです。キーワードを入力するとき、クエリはこの 4 つのテーブルをチェックし、この 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... 

こんな感じでやってみました

$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";

このクエリは約 50% 機能しますが、100% で機能することはありません。問題は、機関カテゴリの下に都市名とプロフィール画像が表示されず、都市と科目フィールドの下に地区名とカテゴリ名が表示されないことです。また、この種のクエリは効果がなく、時間とリソースを無駄にしていませんか?

ありがとうございました。

4

2 に答える 2

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
于 2013-02-10T06:34:09.013 に答える
0

UNIONSELECTすべてのクエリの結果を、列名/データ型の 1 つのセットを持つ 1 つの大きなテーブルに入れようとします。SELECTしたがって、すべてのステートメントの列数と各列のデータ型が一致している必要があります。タイプを分離するための便利な戦術であるキーワードをすでに使用しています。これを機能させるには、適切な列で追加のデータを選択できると思います。

あなたがすべきことは、それを試してパフォーマンスを測定することだと思います。次に、別々のデータベース呼び出しを並行して行い、結果を取得してそのパフォーマンスを測定します。2 番目のバージョンの方が理解しやすく維持しやすいので、それらは匹敵すると思います。

于 2013-02-10T05:48:47.647 に答える