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