如何从三个表创建视图

时间:2014-02-13 15:21:34

标签: mysql sql

我从3个表中获取组合记录时遇到问题。

这是表格的结构

CREATE TABLE IF NOT EXISTS `adds` (
`addid` int(11) NOT NULL AUTO_INCREMENT,
`addtypeid` varchar(45) NOT NULL,
`addcreatedon` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`addtitle` varchar(255) DEFAULT NULL,
`addtext` text NOT NULL,
PRIMARY KEY (`addid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=40 ;


CREATE TABLE IF NOT EXISTS `adds_filters` (
`addfilterid` int(11) NOT NULL AUTO_INCREMENT,
`addid` int(11) NOT NULL,
`filterid` int(11) NOT NULL,
PRIMARY KEY (`addfilterid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=40 ;


CREATE TABLE IF NOT EXISTS `categories_filters` (
`filterid` int(11) NOT NULL AUTO_INCREMENT,
`catid` varchar(45) NOT NULL,
`filtername` varchar(45) NOT NULL,
`sorder` int(11) DEFAULT NULL,
`visible` int(11) DEFAULT NULL,
PRIMARY KEY (`filterid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=230 ;

添加与adds_filters有一对多的关系。也就是说,一个添加可以有多个过滤器。

我需要的是以下内容:

我想创建一个视图,当select *将返回所有添加的行,以及filterid(s)和相应的filtername(s)。请注意,一个添加可能有许多filterid(s)

任何人都可以帮我吗?

此致

2 个答案:

答案 0 :(得分:2)

create view v1 as
select adds.addid as addid, categories_filters.filtername as filtername, categories_filters.filterid as filterid  
from adds inner join adds_filters on adds.addid = adds_filters.addid
inner join categories_filters on categories_filters.filterid = adds_filters.filterid

答案 1 :(得分:2)

您不需要视图。

我认为您想要使用LEFT OUTER JOINGROUP_CONCAT()的组合。这样,您将获得adds表中每行的1个结果,以及相关的filter_ids和filter_names列表(如果有)。

这样的事情:

select adds.addid, adds.addtypeid, adds.addcreatedon, adds.addtitle, adds.addtext,
  group_concat(adds_filters.filterid) as filter_ids, 
  group_concat(categories.filtername) as filter_names
from adds
  left outer join adds_filters on adds_filters.addid = adds.addid
  left outer join categories_filters on categories_filters.filterid = adds_filters.filterid
group by adds.addid, adds.addtypeid, adds.addcreatedon, adds.addtitle, adds.addtext;