Mysql 同一列但不同行的WHERE和子句 事先资料通告
我有三张桌子: 类型 原型Mysql 同一列但不同行的WHERE和子句 事先资料通告,mysql,sql,join,Mysql,Sql,Join,我有三张桌子: 类型 原型 +----+-----------------------------------------+------------+------------+ | id | name | created_at | updated_at | +----+-----------------------------------------+------------+------------+ | 1 | Gild
+----+-----------------------------------------+------------+------------+
| id | name | created_at | updated_at |
+----+-----------------------------------------+------------+------------+
| 1 | Gildan Softstyle Adult Ringspun T-shirt | NULL | NULL |
+----+-----------------------------------------+------------+------------+
过滤器
+----+-------------+---------------------+-------+------------+------------+
| id | name | value | extra | created_at | updated_at |
+----+-------------+---------------------+-------+------------+------------+
| 1 | gender | male | NULL | NULL | NULL |
| 2 | gender | female | NULL | NULL | NULL |
| 3 | age_group | adult | NULL | NULL | NULL |
| 4 | age_group | child | NULL | NULL | NULL |
| 5 | age_group | baby | NULL | NULL | NULL |
+----+-------------+---------------------+-------+------------+------------+
它们通过n-m关系相互关联,因此有各自的连接表类型\原型
,类型\过滤器
,原型\过滤器
。有关更多详细信息,请查看我的
问题本身
我正在尝试设置过滤系统(使用Laravel),因此我需要查询与所有给定的过滤器相关的所有原型(逻辑和)。到目前为止,只要用户只选择了一个过滤器,我就能够获得:
select * from `prototypes`
inner join `types_prototypes` on `prototypes`.`id` = `types_prototypes`.`prototype_id`
inner join `prototypes_filters` on `prototypes`.`id` = `prototypes_filters`.`prototype_id`
inner join `filters` on `prototypes_filters`.`filter_id` = `filters`.`id`
where `types_prototypes`.`type_id` = ? and `filter_id` = ? group by `prototypes`.`id`
问题本身在于,只要我们有几个应该同时有效的过滤器,该查询就不适用:
...
where `types_prototypes`.`type_id` = ? and `filter_id` = ? and `filter_id` = ? group by `prototypes`.`id`
我知道,在哪里。。。而且
不起作用,因为我只能加入一个列filter\u id
,该列在同一时间只能包含一个值(实际上groupBy()
负责什么)。因此,在这个意义上,我有一个新的一行,用于相同的原型与另一个过滤器的关系,例如:
+----+-----------------------------------------+------------+------------+---------+--------------+--------------+-----------+----+-----------+-------+-------+------------+------------+
| id | name | created_at | updated_at | type_id | prototype_id | prototype_id | filter_id | id | name | value | extra | created_at | updated_at |
+----+-----------------------------------------+------------+------------+---------+--------------+--------------+-----------+----+-----------+-------+-------+------------+------------+
| 1 | Gildan Softstyle Adult Ringspun T-shirt | NULL | NULL | 1 | 1 | 1 | 1 | 1 | gender | male | NULL | NULL | NULL |
| 1 | Gildan Softstyle Adult Ringspun T-shirt | NULL | NULL | 1 | 1 | 1 | 3 | 3 | age_group | adult | NULL | NULL | NULL |
+----+-----------------------------------------+------------+------------+---------+--------------+--------------+-----------+----+-----------+-------+-------+------------+------------+
我已经尝试了几种不同的方法,包括where'filter\u id'in(?,)
,where FIND\u in_SET('filter\u id','?,?')
,甚至根据EAV模式重构了我的数据库(当过滤器
分为过滤器名称
和过滤器
)。但每次我只获得满足整套要求的条目(等于逻辑或),例如(这里我们有成人和男性的原型,但不仅是成人男性的原型):
我几乎绝望了,有人知道吗?
感谢您在建议中提供的帮助,并为这么多的文字感到抱歉,我只想描述所有情况。对于每个条件,您必须重复加入过滤器表
select * from prototypes AS p
inner join types_prototypes AS tp1 on p.id = tp1.prototype_id
inner join prototypes_filters AS pf1 on p.id = pf1.prototype_id
inner join filters AS f1 on pf1.filter_id = f1.id
inner join types_prototypes AS tp2 on p.id = tp2.prototype_id
inner join prototypes_filters AS pf2 on p.id = pf2.prototype_id
inner join filters AS f2 on pf2.filter_id = f2.id
where tp1.type_id = ? and f1.filter_id = ?
AND tp2.type_id = ? and f2.filter_id = ?
group by prototypes.id
对于每个条件,您必须重复地加入过滤器表
select * from prototypes AS p
inner join types_prototypes AS tp1 on p.id = tp1.prototype_id
inner join prototypes_filters AS pf1 on p.id = pf1.prototype_id
inner join filters AS f1 on pf1.filter_id = f1.id
inner join types_prototypes AS tp2 on p.id = tp2.prototype_id
inner join prototypes_filters AS pf2 on p.id = pf2.prototype_id
inner join filters AS f2 on pf2.filter_id = f2.id
where tp1.type_id = ? and f1.filter_id = ?
AND tp2.type_id = ? and f2.filter_id = ?
group by prototypes.id
和(
filter\u id`=?或filter\u id
=?)`括号是相关的。你的意思是在psedo代码-->中(@FilterIDs为NULL或在(@FilterIDs)中的FilterIDs)和(@TypeIDs为NULL或在(@TypeIDs)中的TypeID?@riggsfully在这种情况下,我得到了第一个和第二个要求的条目,但不是同时满足两个条目的条目。例如。我正在寻找适合成年男性的服装,并过滤性别:男性和年龄:成人。但是按照你的方式,我也会为儿童男性(男孩)和成年女性购买服装。和(filter\u id`=?或filter\u id
=?)`括号是相关的,你的意思是在psedo代码-->中(@FilterIDs中的@FilterIDs为NULL或FilterIDs)和(@TypeIDs中的@TypeID为NULL或TypeID))?@RiggsFolly在本例中,我得到的是第一个和第二个要求的条目,但不是同时满足这两个条目的条目。例如。我正在寻找适合成年男性的服装,并过滤性别:男性和年龄:成人。但你的方式,我也会得到儿童服装男子(男孩)和成年妇女。
select * from prototypes AS p
inner join types_prototypes AS tp1 on p.id = tp1.prototype_id
inner join prototypes_filters AS pf1 on p.id = pf1.prototype_id
inner join filters AS f1 on pf1.filter_id = f1.id
inner join types_prototypes AS tp2 on p.id = tp2.prototype_id
inner join prototypes_filters AS pf2 on p.id = pf2.prototype_id
inner join filters AS f2 on pf2.filter_id = f2.id
where tp1.type_id = ? and f1.filter_id = ?
AND tp2.type_id = ? and f2.filter_id = ?
group by prototypes.id