Mysql 如何搜索两个表

Mysql 如何搜索两个表,mysql,sql,Mysql,Sql,我得到了一个查询,可以按标题、演员、描述等搜索电影,并按标题中有搜索词的电影排序结果 select movie.id, movie.title from movie where title like '%searchTerm%' or cast like '%searchTerm%' or director like '%searchTerm%' or FullPlot like '%searchTerm%' order by (title like '%searchTerm%')

我得到了一个查询,可以按标题、演员、描述等搜索电影,并按标题中有搜索词的电影排序结果

select movie.id, movie.title  
from movie 
where 
title like '%searchTerm%' or
cast like '%searchTerm%' or
director like '%searchTerm%' or 
FullPlot like '%searchTerm%' 
order by (title like '%searchTerm%') desc ## this gives priority to results thatr have the search term in the title
现在我有了一个新的表,名为“AlsoKnownAs”。此表包含有关电影在其他语言中的名称的数据。例如Cidade De Deus(2003)又名上帝之城(2003)

在搜索电影时,我也需要搜索这个新表,并将其作为二级排序。因此,在AKA表中包含searchTerm的电影将在标题中包含searchTerm的电影之后出现

select movie.id, movie.title  
from movie 
where 
title like '%searchTerm%' or
cast like '%searchTerm%' or
director like '%searchTerm%' or 
FullPlot like '%searchTerm%' 
order by (title like '%searchTerm%') desc ## this gives priority to results thatr have the search term in the title
我不知道该怎么做。似乎我需要将找到的术语存储在一个变量中,以便可以按它排序

欢迎任何帮助

AlsoKownAs table
'id', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
'movieId', 'varchar(10)', 'NO', '', NULL, ''
'aka', 'varchar(305)', 'NO', '', NULL, ''
'country', 'varchar(100)', 'YES', '', NULL, ''

据我所知,你只需要加入他们。您可以将
aka
添加为order by中的字段(但它将是原始标题的第二个字段):


免责声明:我的dbms是mssql,但是我很确定这个查询中的语法是相同的

我是否遗漏了一些东西,但是简单的
连接
不就可以了吗

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
因此,这将是:

select movie.id, movie.title, AlsoKownAs.aka
from movie 
left join AlsoKnowAs on movie.id = AlsoKnowAs.movieId
where 
title like '%searchTerm%'
-- .. rest skipped

可以使用UNION子句在两个表中进行搜索

select *
from (
    select 1 as qOrder, m.id, m.title, m.cast, m.director, m.fullplot 
    from movie m
    union
    select 2 as qorder, m.id, a.aka as title, m.cast, m.director, m.fullplot
    from akamovie a
    join movie m on a.movieid = m.id
) alltitles
where title like '%searchTerm%' or
    cast like '%searchTerm%' or
    director like '%searchTerm%' or 
    FullPlot like '%searchTerm%' 
order by qOrder asc, (title like '%searchTerm%') desc;

如果您只想返回唯一的电影,那么除了左加入外,您还需要按id和标题分组,这样您就不会获得多个aka电影的副本

您可以使用条件聚合来确定是否有任何aka匹配,并将其用于您的订单

select id, title from (
    select t1.id, t1.title,
        sum(aka like '%searchTerm%') aka_count
    from movie t1
    left join AlsoKnownAs t2 on t1.id = t2.movieId
    where title like '%searchTerm%' 
    or cast like '%searchTerm%' 
    or director like '%searchTerm%'  
    or FullPlot like '%searchTerm%' 
    or aka like '%searchTerm%'
    group by t1.id, t1.title
) order by (title like '%searchTerm%') desc, (aka_count > 0) desc
编辑

对aka表进行单表扫描并通过派生表左键连接这些结果可能会更快:

select movie.id, movie.title  
from movie 
left join (
    select distinct movieId from AlsoKnownAs where aka like '%searchTerm%'
) t1 on t1.movieId = movie.id
where 
title like '%searchTerm%' or
cast like '%searchTerm%' or
director like '%searchTerm%' or 
FullPlot like '%searchTerm%' or
t1.movieId IS NOT NULL
order by (title like '%searchTerm%'), (t1.movieId IS NOT NULL) desc

也许你不应该把所有的标题都放在那张表格里。@DanielA.White我不明白。将电影表中的标题作为一列放好?不,我的意思是将电影的所有标题放在
AlsoKnownAs
table@DanielA.White可以这样做,但仍然有搜索两者的问题tables@code578841441然后,您可能希望为
aka
fieldindex编制索引,使其工作,但在7秒后返回。另一个答案在大约3秒时稍微快一点。谢谢你的帮助。第二个很快。3秒。你认为还有什么能让它更快?@code578841441双通配符阻止使用索引并强制进行表扫描,因此我认为没有任何改进的余地