Php 多重匹配条件

Php 多重匹配条件,php,mysql,sql,Php,Mysql,Sql,我正在尝试根据匹配的关键字筛选结果。我已经成功地实现了这一部分。然而,有必要让这场比赛有些是独家的,有些是包容性的。例如,如果用户选择了大号和衬衫,则产品将需要专门匹配这些。但是用户可能希望看到红色、绿色和蓝色。我怎样才能做到这一点?以下是基本概念,但工会似乎不起作用: SELECT id FROM Filters WHERE disabled = '0' AND filter IN ('large','shirt') GROUP BY id HAVING COUNT(filter) = 2

我正在尝试根据匹配的关键字筛选结果。我已经成功地实现了这一部分。然而,有必要让这场比赛有些是独家的,有些是包容性的。例如,如果用户选择了大号和衬衫,则产品将需要专门匹配这些。但是用户可能希望看到红色、绿色和蓝色。我怎样才能做到这一点?以下是基本概念,但工会似乎不起作用:

SELECT id
FROM Filters
WHERE disabled = '0' AND filter IN ('large','shirt')
GROUP BY id 
HAVING COUNT(filter) = 2

UNION DISTINCT

SELECT id
FROM Filters
WHERE disabled = '0' AND filter IN ('red','green','blue') 
GROUP BY id 
HAVING COUNT(filter) > 1
谢谢

如果我没有弄错,您应该能够使用带有HAVING BY子句的聚合查询,该子句使用条件聚合实现逻辑

考虑以下查询:

SELECT id
FROM Filters
GROUP BY id
HAVING
    MAX(CASE WHEN filter = 'large' THEN 1 END) = 1
    AND MAX(CASE WHEN filter = 'shirt' THEN 1 END) = 1
    AND MAX(CASE WHEN filter IN ('red','green','blue') THEN 1 END) = 1
详情:

此聚合条件确保此id有一个filter='large'的记录:

这将检查此id是否有一条记录,其中filter='shirt':

这将检查3种颜色中是否至少有一种可用:

MAX(CASE WHEN filter IN ('red','green','blue') THEN 1 END) = 1

如果需要,您应该能够使逻辑适应您的确切需求

您正在创建自己的关键字吗?@Arnaud UNION DISTINCT实际上是默认操作,如果不包括“ALL”关键字@Eric是的,过滤器将是动态的。我可以处理,我只是不知道整体结构…我应用了如上所示的语法,但它似乎只显示一条记录,无论应用了什么包容性过滤器。有什么想法吗?我还添加了禁用了='0'的位置。但这不应该影响它,对吗?哦,我忘了添加“按id分组”。我现在得到了更好的结果,但如果我选择“紫色和青色”,结果列表是相同的。就像它只匹配了前两个条件,但没有一个包含在内。是否可以添加“HAVING COUNTfilter>1”作为MAX语句的一部分?@user1646428:上面的查询选择:大号和衬衫,红色或绿色或蓝色。。。这演示了逻辑,数据与您的问题相对应。您应该能够将其应用于和/或过滤器的其他组合…抱歉,我的过滤器列表有问题。在我纠正了这一点之后,这就像一个符咒!谢谢GMB+1为简单起见
    MAX(CASE WHEN filter = 'shirt' THEN 1 END) = 1
MAX(CASE WHEN filter IN ('red','green','blue') THEN 1 END) = 1