Mysql 对多个连接行中的多个字段进行过滤 (AND) 查询

Mysql filter (AND) query on multiple fields in multiple joined rows

我创建了一个查询,其中 returns 包含产品及其字段和值的列表。现在我想在字段中搜索某个值并获得与此搜索查询匹配的结果列表。问题是我想要一个 AND 结构,所以 fieldx 值必须像 %car% 而 fieldy 值必须像 %chrome%。

这是我的查询和结果集的示例:

查询

SELECT p.id as product,pf.field_name,pfv.field_value
FROM product p
JOIN field pf ON pf.product_id = p.product_id
JOIN field_val pfv ON pfv.field_id = pf.field_id

结果集

product | field_name | field_value
pr1     | meta_title | Example text
pr1     | meta_kw    | keyword,keyword1
pr1     | prod_name  | Product 1
pr2 ....

考虑到上述查询和结果集,我想执行以下操作: 查询 meta_title 包含 'Example' 且 prod_name 包含 'Product' 的所有产品。之后,我想对结果进行分组,以便只返回两个搜索查询匹配的产品。

我尝试了所有我能想到的方法,并且针对相同的问题尝试了很多解决方案,但我认为我的不同,因为我需要字段名称上的 AND 匹配以及多行上的值。

例如,我尝试将其添加为 WHERE 子句:

WHERE
(field_name = 'meta_title' AND field_value LIKE '%Example%') AND 
(field_name = 'prod_name' AND field_value LIKE '%Product%')

显然这行不通,因为在 meta_title 上的第一个 where 之后,其他字段名称没有留下任何结果。但是将 WHERE 更改为 OR 不会给我想要的结果。

我也尝试过 HAVING,但结果似乎相同。

任何人都知道如何解决这个问题,或者这是不可能的?

试试这个:

select product from [table_name]
    WHERE field_name like 'meta_title' AND field_value LIKE '%Example%'

UNION

select product from [table_name]
    WHERE field_name like 'prod_name' AND field_value LIKE '%Product%'

一个相对简单的方法是使用 group byhaving:

SELECT p.id as product
FROM product p JOIN
     field pf
     ON pf.product_id = p.product_id JOIN
     field_val pfv
     ON pfv.field_id = pf.field_id
WHERE (field_name = 'meta_title' AND field_value LIKE '%Example%') OR 
      (field_name = 'prod_name' AND field_value LIKE '%Product%')
GROUP BY p.id
HAVING COUNT(DISTINCT field_name) = 2;

通过修改 HAVING 子句(并且可能删除 WHERE),可以针对不同字段的存在和不存在表达许多不同的逻辑。例如 > 0 将是 OR,而 = 1 将是一个值或另一个值,但不能同时是两个值。

首先:我会选择最简单的方法。如果 Prera​​k Solas 解决方案有效并且性能对您来说还可以,那就去吧。

另一种解决方案是使用枢轴table。有了这个,你的 table 的 select 就会 return 像这样:

product | meta_title   | meta_kw          | prod_name
pr1     | Example text | keyword,keyword1 | Product 1
pr2 ...

您可以像这样轻松查询:

SELECT 
  p.Id 
FROM 
  (subquery/view) 
WHERE 
  meta_title LIKE '%Example%' AND 
  prod_name LIKE '%Product%'

有关枢轴的更多信息,请阅读this