2011-06-13 44 views
0

我想为championships表格中的每个冠军选择当前持有者,并且返回尚未获得任何获胜者的冠军的NULL如何为每个锦标赛选择当前持有人?

下面是创建报表的两个表:

CREATE TABLE `championships` (
    `id` int(10) unsigned NOT NULL AUTO_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; 

什么MySQL的语句返回的数据集,我想?

+0

'title_history'表中的'winner'中有什么字符串? – alex 2011-06-13 09:24:39

+0

获胜者的名字,即John Doe。 – 2011-06-13 09:42:03

回答

0

假设您将冠军的获胜者存储为持有者的主键/ ID,则应如此操作。您可能想要添加另一个连接以从另一个表中获取团队的实际名称。

由于LEFT join只会在匹配时从'right'表中选择行,所以没有匹配的所有行都应该返回NULL。

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

编辑后的版本:

进一步深入了解你的表和你的评论,也许试试这个子查询:

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 

如果我正确理解你的结构,这应该得到每个冠军的最后一个赢家?

+0

嗨。这是不正确的,因为冠军的名字存储在'title_history'表中,而不是'championships'表。 – 2011-06-13 10:06:25

+0

检查我编辑的版本,应该工作? – Codecraft 2011-06-13 10:23:30

+0

它确实如此!谢谢 :-) – 2011-06-13 10:47:05