0

我这里有点情况。

环境

我在这里有一个系列数据库。一张表用于系列本身,一张用于连接到系列表的季节,一张用于连接到季节表的剧集。由于有不同国家/地区的播出日期,我有另一个名为“series_data”的表格,如下所示:

CREATE TABLE IF NOT EXISTS `episode_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `episode_id` int(11) NOT NULL,
  `country` char(3) NOT NULL,
  `title` varchar(255) NOT NULL,
  `date` date NOT NULL,
  `tba` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `episode_id` (`episode_id`),
  KEY `date` (`date`),
  KEY `country` (`country`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

现在我正在尝试使用以下查询从数据库中的每个系列中收集最后播出的剧集:

SELECT
    *
FROM
    `episode_data` ed
WHERE
    `ed`.`date` < CURDATE( ) &&
    `ed`.`date` != '1970-01-01' &&
    `ed`.`series_id` = 1
GROUP BY
    `ed`.`country` DESC
ORDER BY
    `ed`.`date` DESC 

由于我已将所有内容标准化,因此我将 'episode_id' 更改为 'series_id' 以使查询不那么复杂。

我想要完成的事情

我希望将每个国家/地区的最后播出的剧集作为一个查询的返回结果实际宣布(eddate!='1970-01-01')。

有什么问题

我现在知道(搜索谷歌,发现不是我在这里工作的答案),排序发生在分组之后,所以我的“日期”排序完全没用。

另一个问题是上面的查询正在运行,但总是采用与我的条件匹配的最低 id 的条目,因为这些是表索引中的第一个条目。

问题是什么?

怎么可能做到以上。我不知道分组是否是正确的方法。如果没有“单线”,我认为唯一的方法是我想避免的子查询,因为据我所知,这比设置了正确索引的单线慢。

希望这里有你需要的一切:)

示例数据

CREATE TABLE IF NOT EXISTS `episode_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `episode_id` int(11) NOT NULL,
  `country` char(3) NOT NULL,
  `title` varchar(255) NOT NULL,
  `date` date NOT NULL,
  `tba` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `episode_id` (`episode_id`),
  KEY `date` (`date`),
  KEY `country` (`country`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

INSERT INTO `episode_data` (`id`, `episode_id`, `country`, `title`, `date`, `tba`) VALUES
(4942, 2471, 'de', 'Väter und Töchter', '2013-08-06', 0),
(4944, 2472, 'de', 'Neue Perspektiven', '2013-08-13', 0),
(5013, 2507, 'us', 'Into the Deep', '2013-08-06', 0),
(5015, 2508, 'us', 'The Mirror Has Three Faces', '2013-08-13', 0);

注意力! 这是带有“EPISODE_ID”而不是“SERIES_ID”的原始表数据。

我想要的数据是与今天最接近的数据,这里是 4944 和 5015。

4

1 回答 1

0

如果您想要每个国家/地区的最后播出日期,请使用此聚合:

SELECT country, max(date) as lastdate
FROM `episode_data` ed
WHERE `ed`.`date` < CURDATE( ) AND
      `ed`.`date` != '1970-01-01' AND
      `ed`.`series_id` = 1
GROUP BY `ed`.`country`;

如果您也尝试获取episode_idand title,则可以使用group_concat()and substring_index()

SELECT country, max(date) as lastdate,
       substring_index(group_concat(episode_id order by date desc), ',', 1
                      ) as episode_id,
       substring_index(group_concat(title order by date desc separator '|'), '|', 1
                      ) as title
FROM `episode_data` ed
WHERE `ed`.`date` < CURDATE( ) AND
      `ed`.`date` != '1970-01-01' AND
      `ed`.`series_id` = 1
GROUP BY `ed`.`country`;

请注意,这对标题使用了不同的分隔符,假设它可能有一个逗号。

于 2013-08-21T21:01:50.663 回答