2013-02-10 55 views
1

我试图让站点搜索查询有效查询。我需要做的这个查询是我想根据搜索关键字(导师,研究所,科目,城市)选择四个主要列。当输入关键字时,查询必须检查这四个表并且需要在这四个类别下显示搜索结果。当显示搜索结果时,我需要添加一些值以产生有意义的搜索结果。例如:想在家教类导师显示作为搜索结果我需要显示他/她的姓名,城市,轮廓影像等创建多个表

它是这样的。

**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%的工作。问题是不显示城市名称和概况图像在研究所类别下,不能显示城市和科目领域下的地区名称和类别名称。我也想这种查询是无效的,它是否浪费时间和资源?

谢谢。

+0

谷歌翻译 – shnisaka 2013-02-10 05:43:12

+1

你能[sqlfiddle(http://sqlfiddle.com)这个样本数据? – Orangecrush 2013-02-10 05:43:41

+0

我可以在没有sqlfiddle的情况下获得解决方案吗?它的努力工作,我必须与更多的表工作。 – TNK 2013-02-10 05:47:16

回答

0

UNION试图将所有SELECT查询的结果放入一个包含一组列名/数据类型的大表中。因此,所有SELECT语句的每列的列数和数据类型必须匹配。您已经在使用关键字,这是一种有用的策略来区分您的类型。我想你可以在正确的列中选择额外的数据来完成这项工作。

,我认为你应该做的是尝试,并测量性能。然后并行进行单独的数据库调用,并获得结果并测量性能。我认为他们将与第二名相比更容易理解和维护。

+0

感谢您的回复。但你的回答对我来说并不明确。所以你可以请一个例子来阐述它。谢谢。 – TNK 2013-02-10 05:58:01

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

你好@Saharsh Shah很高兴再次见到你。等一下我会检查这个 – TNK 2013-02-10 06:45:05

+0

我CATEGORY_NAME来自类别表和category_subjects表有哪些主题属于哪一类.. – TNK 2013-02-10 06:49:10

+0

@TharangaNuwan检查我的更新答案 – 2013-02-10 06:58:25