Mysql 使用多个表创建有效查询
我正在尝试对站点搜索进行查询。我需要对这个查询做的是,我想根据搜索关键字选择四个主要列(导师、学院、科目、城市)。键入关键字时,查询必须检查这四个表,并需要显示这四个类别下的搜索结果。当显示搜索结果时,我需要添加一些值以生成有意义的搜索结果。例如:考虑显示导师类别下的导师作为搜索结果,我需要显示他/她的姓名、城市、个人资料图像等 是这样的Mysql 使用多个表创建有效查询,mysql,sql,select,union,Mysql,Sql,Select,Union,我正在尝试对站点搜索进行查询。我需要对这个查询做的是,我想根据搜索关键字选择四个主要列(导师、学院、科目、城市)。键入关键字时,查询必须检查这四个表,并需要显示这四个类别下的搜索结果。当显示搜索结果时,我需要添加一些值以生成有意义的搜索结果。例如:考虑显示导师类别下的导师作为搜索结果,我需要显示他/她的姓名、城市、个人资料图像等 是这样的 **Tutors** tutor's name city profile image **institutes** institute's
**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%内工作。问题是它不能在institutes类别下显示城市名称和个人资料图像,不能在cities和subjects字段下显示district name和category name。我还想知道,这种查询是无效的,它会浪费时间和资源吗
多谢各位
UNION
尝试将所有SELECT
查询的结果放入一个包含一组列名/数据类型的大表中。因此,所有SELECT
语句的列数和每列的数据类型必须匹配。您已经在使用关键字了,这是一种用于分隔类型的有用策略。我认为您可以在正确的列中选择额外的数据来实现这一点
我认为你应该做的是尝试一下,衡量一下你的表现。然后并行地进行单独的数据库调用,得到结果并测量性能。我认为它们可以与第二种方法相比,更易于理解和维护。尝试以下方法:
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
你能用样本数据来解释吗?我能得到一个没有sqlfiddle的解决方案吗?这是一个艰苦的工作,我必须与更多的表。感谢您的回复。但是你的回答我不清楚。所以你能用一个例子来详细说明一下吗。谢谢。你好@Saharsh Shah很高兴再次见到你。请稍候,我将检查此项我的类别名称来自类别表和类别主题表,其中有哪个主题属于哪个类别。同样,城市名称未选择为学院。不确定。我也使用相同的地址和城市表。但不是选择城市作为研究所,而是与导师合作。现在可以了。另一种情况是,我可以将查询第一行中的“导师代码”更改为成员代码吗