Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 同一列但不同行的WHERE和子句 事先资料通告_Mysql_Sql_Join - Fatal编程技术网

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