0

表类型

id | genre     | display
---+-----------+------------
1  | Action    | 1
2  | Comedy    | 0
3  | Romance   | 1

桌上电影

id | genre_id  | movie         | year    | display
---+-----------+---------------+---------+------------
1  | 1         | Kill Bill     | 2003    | 1
2  | 1         | Die Hard      | 1988    | 0
3  | 2         | Anchorman     | 2004    | 1
4  | 3         | Titanic       | 1997    | 1
5  | 3         | Casablanca    | 1942    | 1

询问

SELECT genre.genre, movies.movie, movies.year FROM `genre` JOIN `movies` ON
genre.id = movies.genre_id WHERE genre.display = 1 AND movies.display = 1

我正在尝试编写一个 sql 语句,以便按此特定顺序获得以下结果。如果流派的显示为 1,则将显示流派本身,以及显示为 1 的任何电影。此外,流派名称不应重复:

  1. 行动

    • 杀死比尔
    • 2003年
  2. 浪漫

    • 泰坦尼克号
    • 1997
    • 卡萨布兰卡
    • 1942年
4

1 回答 1

2

您的查询选择了正确的行。我认为唯一的问题是订购:

SELECT genre.genre, movies.movie, movies.year
FROM `genre` JOIN
     `movies`
     ON genre.id = movies.genre_id
WHERE genre.display = 1 AND movies.display = 1
order by genre.genre, movies.year desc;

如果您不希望流派重复,您可以使用一个时髦的技巧。也就是说,电影union中的类型NULL,然后正确排序并记住在那之后删除名称:

select (case when movie is NULL then genre else NULL end) as genre,
       movie, year
from ((select genre, NULL as movie, NULL as year
       from genre
       where display = 1
      ) union all
      (SELECT genre.genre, movies.movie, movies.year
       FROM `genre` JOIN
            `movies`
            ON genre.id = movies.genre_id
       WHERE genre.display = 1 AND movies.display = 1
      )
     ) t
order by genre,
         movie is null desc,
         year desc

通常,我会说在应用程序层中执行此操作,但将 SQL 放在一起会很有趣。

于 2013-05-31T01:53:19.870 回答