从 2 个表中获取记录数 - 一对多关系

Posted

技术标签:

【中文标题】从 2 个表中获取记录数 - 一对多关系【英文标题】:getting number of records from 2 tables - one to many relationship 【发布时间】:2014-02-19 09:34:25 【问题描述】:

我有搜索查询的问题,我必须即时构建以从数据库中返回记录。

我有 2 个表:adds andadds_filters`。为了简单起见,我使表格添加的时间比实际短,删除了一些(不相关的)字段 我的表结构:

CREATE TABLE IF NOT EXISTS `adds` (
`addid` int(11) NOT NULL AUTO_INCREMENT,
`memberid` int(11) NOT NULL,
`isnew` int(11) NOT NULL,
`catid` int(11) NOT NULL,
`manufacturerid` int(11) NOT NULL,
`modelid` varchar(255) DEFAULT NULL,
`colorid` int(11) DEFAULT NULL,
`geographicareaid` int(45) NOT NULL,
`addtypeid` varchar(45) NOT NULL,
`addcreatedon` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`addvalidfrom` date NOT NULL,
`addvaliduntil` date NOT NULL,
`addcreatedfromip` varchar(255) NOT NULL,
`yearofmanufacturing` varchar(255) DEFAULT NULL,
`monthofmanufacturing` int(11) DEFAULT NULL,
`hoursused` int(11) DEFAULT NULL,
`cc2` int(11) DEFAULT NULL,
`horsepowers` int(11) DEFAULT NULL,
`metalic` tinyint(4) DEFAULT NULL,
`isdamaged` tinyint(4) DEFAULT NULL,
`price` float DEFAULT NULL,
`hasvat` tinyint(4) NOT NULL,
`canbenegotiated` tinyint(4) DEFAULT NULL,
`addtitle` varchar(255) DEFAULT NULL,
`addtext` text NOT NULL,
`youtubevideo` varchar(255) DEFAULT NULL,
`visible` tinyint(4) DEFAULT NULL,
`ff1` varchar(255) DEFAULT NULL,
`ff2` varchar(255) DEFAULT NULL,
`ff3` varchar(255) DEFAULT NULL,
`ff4` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`addid`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=43 ;


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=45 ;

Here is the fiddle

问题是用户可以为每次添加添加多个过滤器,也就是说,如果 车辆有空调、GPS、可移动驾驶室等...此数据存储在adds_filters。因此,一个添加可以有多个过滤器。

当用户选择 catid 为 1,manufacturerid 为 1 然后用户使用 id 检查过滤器时,查询应该是什么样子 例如 67 和 158?

我更喜欢查看查询,但我不知道如何构建这样的视图。首选视图的原因是,在这种情况下,我将能够使用 select * 而不是复杂的查询...

任何帮助将不胜感激。

【问题讨论】:

为清楚起见,请提供SHOW CREATE TABLE adds;SHOW CREATE TABLE adds_filters;。如果它太大,你可以post it here Alexander,我只是编辑我的帖子,请看一下 Here is the fiddle for you 添加一些插入,这样我们就可以获得样本数据,并提供所需的输出(以及您已经尝试过的查询) 我在表格中添加数据...请检查。 您需要提供链接。每次修改时,小提琴都会发生变化,因此您的小提琴已经有另一个 url :) 【参考方案1】:

使用此表结构,如果要显示 filterids,则需要为每个选中的 filterid 设置子查询。 不显示,你可以使用DISTINCTIN

Here is the query without displaying filterids

选择不同的 a.* FROM 添加了一个 加入添加过滤器 f ON a.`addid` = f.`addid` 其中 a.`catid` = 1 AND a.`manufacturid` = 1 AND f.`filterid` IN (67, 158);

Here is the query, that displays two different filterids:

选择 t1.*, t2.filterid 作为 filterid2 从 ( 选择不同的 a.*, f.`filterid` FROM 添加了一个 加入添加过滤器 f ON a.`addid` = f.`addid` 其中 a.`catid` = 1 AND a.`manufacturid` = 1 和 f.`filterid` = 67 ) t1 加入 ( SELECT DISTINCT a.`addid`, f.`filterid` FROM 添加了一个 加入添加过滤器 f ON a.`addid` = f.`addid` 其中 a.`catid` = 1 AND a.`manufacturid` = 1 和 f.`filterid` = 158 ) t2 ON t1.addid = t2.addid;

【讨论】:

这不是问题。我的问题是必须在 2 个表之间进行连接。请重新阅读我的问题,尤其是代码的下面部分

以上是关于从 2 个表中获取记录数 - 一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 以一对多关系获取最后一条记录

如何使用 Django 查询从一对多关系中获取数据

无法删除一对多关系中的记录 laravel eloquent

SQLAlchemy ORM 一对多关系未从数据库加载所有记录

2个表之间的关系 - 一对多和一对一(可空)EF代码优先

如何使用 ADO.NET 从具有一对多关系的 DAL 层中的多个表中返回数据