如何搜索两个表

时间:2015-04-26 18:28:49

标签: 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%') desc ## this gives priority to results thatr have the search term in the title

现在我有了一个名为“AlsoKnownAs”的新表。此表包含有关以其他语言调用哪些电影的数据。例如Cidade De Deus(2003)AKA City Of God(2003)

我需要搜索这个新表,同时我正在搜索电影并将其排序为次要排序。所以在AKA表中包含searchTerm的电影将出现在标题中包含searchTerm的电影之后。

我不知道该怎么做。似乎我需要将找到的术语存储在变量中,以便我可以通过它进行排序。

欢迎任何帮助

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, ''

4 个答案:

答案 0 :(得分:1)

据我所知,你只需要加入他们。您可以通过在顺序中添加aka字段作为字段(但它将是原始标题的次要字段):

SELECT m.id, m.title, a.aka 
FROM movie m
LEFT JOIN AlsoKnownAs a ON m.id = a.movieId
WHERE 
   m.title like '%searchTerm%' or
   m.cast like '%searchTerm%' or
   m.director like '%searchTerm%' or 
   m.FullPlot like '%searchTerm%' or
   a.aka like '%searchTerm%' 
ORDER BY (m.title like '%searchTerm%') DESC, (a.aka like '%searchTerm%') DESC

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

答案 1 :(得分:1)

我在这里遗漏了什么,但不是简单的join诀窍吗? :

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

答案 2 :(得分:1)

您可以使用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;

答案 3 :(得分:1)

如果您只想要返回独特的电影,那么除了左侧加入之外,您还需要按照ID和标题进行分组,这样您就不会为具有多个已知电影的电影获得重复。

您可以使用条件汇总来确定是否有任何已匹配的商品并将其用于您的订单

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