结合2个查询的PHP MySQL

结合2个查询的PHP MySQL,php,mysql,sql,Php,Mysql,Sql,表格体裁 id | genre | display ---+-----------+------------ 1 | Action | 1 2 | Comedy | 0 3 | Romance | 1 桌上电影 id | genre_id | movie | year | display ---+-----------+---------------+---------+------------ 1 | 1 | Kill

表格体裁

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
质疑

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

  • 行动

    • 杀死比尔
    • 2003年
  • 罗曼史

    • 泰坦尼克号
    • 一九九七年
    • 卡萨布兰卡
    • 1942年

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

    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可能会很有趣。

    如果
    类型。显示
    检查将移动到JOIN子句中怎么办?@raina77ow它应该不会有什么不同。@raina77ow。它对内部连接没有影响。根据输出,二阶应该是什么并不明显be@Orangepill订单应显示类型名称一次,并浏览所有电影及其相关年份。还有一个条件。仅输出显示为1的类型及其后续电影。
    
    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