好的,我有以下问题。
我有两个InnoDB表:'places'和'events'。一个地方可以有很多活动,但事件可以在不进入的情况下创建。在这种情况下,事件的外键为NULL。
表格的简化结构如下:
CREATE TABLE IF NOT EXISTS `events` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`places_id` int(9) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fk_events_places` (`places_id`),
) ENGINE=InnoDB;
ALTER TABLE `events`
ADD CONSTRAINT `events_ibfk_1` FOREIGN KEY (`places_id`) REFERENCES `places` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
CREATE TABLE IF NOT EXISTS `places` (
`id` int(9) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB;
问题是,如何构建包含事件名称和相应地点名称的查询(或者没有值,如果没有分配地点?)。
我能够通过两个查询来完成它,但之后我明显地将那些已经分配的事件分开了。
帮助非常感谢。
答案 0 :(得分:3)
使用OUTER JOIN
SELECT events.col1, events.col2, places.name
FROM events LEFT OUTER JOIN places
ON events.places_id = places.id
在OUTER JOIN中,左侧(或右侧,RIGHT OUTER JOIN)的表控制结果集。在可以找到匹配的地方提供来自另一个表的匹配值,否则这些值为NULL。