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

时间:2015-07-08 10:16:31

标签: mysql sql join having

我创建了一个查询,该查询返回带有字段和值的产品列表。现在,我想在字段中搜索特定值,并获得与此搜索查询匹配的结果列表。问题是我想要一个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更改为OR不会给我想要的结果。

我也试过HAVING,但看起来效果相同。

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

3 个答案:

答案 0 :(得分:0)

试试这个:

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%'

答案 1 :(得分:0)

执行此操作的一种相对简单的方法是使用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),可以为不同字段的存在和不存在表达许多不同的逻辑。例如> 0OR= 1为一个值或另一个值,但不是两者。

答案 2 :(得分:0)

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

另一种解决方案是使用数据透视表。有了这个,你的表的选择将返回如下:

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

的更多信息