开发者

How can I select the current holder for each championship?

I want to select the current holders for each championship in a championships table, and return NULL for championships that have not had any winners yet.

Here are the create statements for the two tables:

CREATE TABLE `championships` (
  `id` int(10) unsigned NOT NULL AU开发者_运维知识库TO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `friendly_name` varchar(255) NOT NULL,
  `rank` int(2) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  UNIQUE KEY `friendly_name` (`friendly_name`)
) ENGINE=InnoDB;

CREATE TABLE `title_history` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `championship` int(10) unsigned NOT NULL,
  `winner` varchar(255) NOT NULL,
  `date_from` date NOT NULL,
  `location` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `championship` (`championship`)
) ENGINE=InnoDB;

ALTER TABLE `title_history` ADD CONSTRAINT `title_history_ibfk_1` FOREIGN KEY (`championship`) REFERENCES `championships` (`id`) ON UPDATE CASCADE;

What MySQL statement would return the data set I wanted?


Assuming you're storing the winner of a championship as the primary key/id of the holder, something like this should work. You might want to add in another join to get the actual name of the team from another table though.

Because LEFT join will only select rows from the 'right' table when there is a match, everything that doesn't have one should come back as NULL.

SELECT name, [holder] 
FROM championships AS c
LEFT JOIN title_history AS h ON c.winner = h.id

EDITED VERSION:

With further insight into your tables and from your comment, maybe try this subselect:

SELECT friendly_name, 
       (SELECT winner FROM title_history WHERE championship = c.id ORDER BY date_from DESC LIMIT 1) 
FROM championships AS c
ORDER BY name

If I understand your structure correctly, that ought to get the last winner of each championship?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜