MySQL在串口中找到上一集?

时间:2017-02-09 18:38:11

标签: mysql sql

SET @current_episode = 1;
SET @current_season = 2;
SET @current_serial = 2;

SELECT * FROM `episode` _episode 
    LEFT JOIN season _season ON _episode.season_id = _season.id
    LEFT JOIN serial _serial ON _season.serial_id  = _serial.id 
WHERE 

    (_episode.episode < @current_episode AND _season.season = @current_season)
        OR 
    (_episode.episode > @current_episode AND _season.season = (@current_season - 1))

ORDER BY _season.season DESC, _episode.episode ASC
LIMIT 0,1

剧集表格结构:

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| season_id   | int(11)      | YES  | MUL | NULL    |                              |
| poster_id   | int(11)      | YES  | MUL | NULL    |                |
| episode     | int(11)      | NO   |     | NULL    |                              |
+-------------+--------------+------+-----+---------+----------------+

季节表结构:

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| serial_id  | int(11)      | YES  | MUL | NULL    |                |
| season     | int(11)      | NO   |     | NULL    |                |

串行表结构:

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |

我的SQL无法正确找到上一集 因为如果我尝试通过季节DESC发现它将是正确的,而剧集编号不是季节的第一集。

1 个答案:

答案 0 :(得分:3)

查找上一集

只需在WHERE之后更新OR子句,然后在_episode.episode上排序DESC

SET @current_episode = 1;
SET @current_season = 2;
SET @current_serial = 2;

SELECT * FROM `episode` _episode 
    LEFT JOIN season _season ON _episode.season_id = _season.id
    LEFT JOIN serial _serial ON _season.serial_id  = _serial.id 
WHERE 

    (_episode.episode < @current_episode AND _season.season = @current_season)
        OR 
    (_season.season < @current_season)

ORDER BY _season.season DESC, _episode.episode DESC
LIMIT 0,1