JOIN 2表与where条件,但显示table2的第一行

时间:2015-11-24 15:21:02

标签: mysql sql-server join

我有2张桌子。一个是电影表,其中存储所有电影数据而另一个是关系表,在那里我可以看到哪个电影附加到哪个类别。如果我想要显示第6类的电影,我就这样加入:

SELECT t1.title, t2.category FROM movies t1
JOIN movie_categories t2 ON t1.movieid = t2.movieid
WHERE t2.category = 6

它运作得很好。然而,电影SEF网址是基于table2的第一行生成的(实际上它应该连接到table3,一个类别表,我会找到sef别名,但是现在我不需要它,我只是想知道如何获取第一类)。所以说,电影有3个类别,看起来像这样:

Table 2 [relations table]
id movieid category
 1   1      3   
 2   1      6   
 3   1      2   

Table 1 [movie table]
movieid
   1      
   2     

我之前显示的查询返回如下结果:

title category
bla1      6
bla2      6

但是要创建sef url,我需要从关系表中获取第一个类别id,在这种情况下为3。

我想知道如何构建查询以实现我所描述的结果。

1 个答案:

答案 0 :(得分:1)

假设:MIN表示movie_Categories中的最低ID,然后显示它的类别值。

  1. 生成一组数据,这是每部电影(子查询)的最低ID
  2. 将其加入电影列表
  3. 然后将您的电影类别加回到具有最小值的生成集合
  4. 再次将影片类别加入到基本影片集中,以获取类别的限制集。
  5. 然后将数据库限制为所需的类别。
  6. drop table movie;
    drop table movie_categories;
    create table movie (movieid int, Title varchar(10));
    create table movie_categories (Id int, movieID int, category int);
    
    insert into movie values (1, 'The');
    insert into movie values (2, 'End');
    insert into movie_categories values (1,1,3);
    insert into movie_categories values (2,1,6);
    insert into movie_categories values (3,1,2);
    
    --To aid in understanding you may want to select * and see why this works and remove the where clause.
    --Basically the two joins to Movie_Categories is once for the LOWEST ID and once again to get the limiting category.
    SELECT M.Title, MC1.Category
    FROM Movie M
    INNER JOIN (SELECT min(ID) ID, MovieID
                from movie_categories mc
                GROUP BY MovieID) L
     on L.MovieID = M.MovieID
    INNER JOIN Movie_Categories MC1 
     on  L.MovieID = MC1.MovieID
    INNER JOIN Movie_Categories MC2
     on l.movieid = mc2.movieid
     and L.ID = MC1.ID
    where mc2.category = 6
    

    结果:

    title category
    The     3
    

    注意:未列出第二个标题,因为movie_category中没有与6类别匹配的记录。