2012-11-27 81 views
1
SELECT keyword 
FROM 
(
    SELECT tutor_Name AS keyword FROM t 
    UNION 
    SELECT subject_name AS keyword FROM s 
    UNION 
    SELECT institute_name AS keyword FROM i 
) s 
WHERE keyword LIKE '%$queryString%' 
LIMIT 10 

此查询根据关键字显示带有主题,导师名称和城市的列表。现在我需要用更多的值修改这个查询。例如,列表中有一个导师姓名,我想显示他/她的当前城市,他/她的个人资料图片等。所以我需要从我的城市表,地址表,tutorImages表中获取这些值。所以任何人都可以帮我做这个查询?使用多个表格进行查询

+1

你尝试过什么?我们不在这里做你的工作;)。但我想你想要'JOIN'命令。 – looper

+0

指定要显示的列和使用JOIN执行相同的操作 –

+0

阅读本文可能会有助于http://www.w3schools.com/sql/sql_join.asp – xurca

回答

2

试试这个它会工作:

$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 subjects AS keyword, 'Subject' AS col, '' city_name, '' image_name, '' tutor_code FROM subject 
       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 
      ) s 
      WHERE keyword LIKE '%$queryString%' 
      LIMIT 10"; 
+0

是的..它为我工作..非常感谢你的帮助.. – ugnuku

0

尝试加入。

SELECT table1.field, table2.field, table3.field 
FROM table1 
JOIN table2 ON table1columnToMatch = table2columnToMatch 
JOIN table3 ON table2columnToMatch = table3columnToMatch 
WHERE tableWithKeyword.keyword = $keyword 
1

与第一个查询的问题是,你取每个表未经过滤的,他们的工会,他们分明,然后过滤结果的所有结果。这在查询时间和资源方面相当无效。

这里您需要的是JOIN。 要了解如何加入工作,阅读本

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

http://dev.mysql.com/doc/refman/5.5/en/join.html

为了让您的查询应该如何看起来像一个想法:旧的重构

SELECT 

给我一点,从手机切换到电脑..阅读文章while;)

对不起,花了点时间。我看你已经找到了解决方案。同时,所以我不会打扰挖掘到这不再

+0

我可以为此提供解决方案吗? – TNK

1

试试这个:

SELECT keyword, city_name, image_name 
FROM (
SELECT tname AS keyword, IFNULL(c1.city_name, '') city_name, IFNULL(ti.image_name, '') image_name FROM 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 tutorImages ti ON t.tutor_id = t1.tutor_id 
UNION 
SELECT sname AS keyword, '' city_name, '' image_name FROM sub 
UNION 
SELECT cname AS keyword, '' city_name, '' image_name FROM c 
UNION 
SELECT iname AS keyword, '' city_name, '' image_name FROM i) s 
WHERE keyword LIKE '%$queryString%' 
LIMIT 10 
+0

我修改你的查询和where子句到这样的子查询WHERE ti.image_type ='profile'。这是工作。但如果导师没有个人资料图像,这些导师不会显示在列表中..你能告诉我为什么吗?谢谢 – ugnuku

+0

这是不可能的,因为我们使用了LEFT JOIN,所以无论他/她有没有图像,查询都会返回所有的导师。并检查我的更新答案 –

+0

否我使用INNER JOIN与查询..它的工作。 – ugnuku