MySQL查询问题

时间:2011-01-05 21:40:48

标签: mysql relational-database

好的,我有以下问题。

我有两个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;

问题是,如何构建包含事件名称和相应地点名称的查询(或者没有值,如果没有分配地点?)

我能够通过两个查询来完成它,但之后我明显地将那些已经分配的事件分开了。

帮助非常感谢。

1 个答案:

答案 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。