我创建了一个查询,该查询返回带有字段和值的产品列表。现在,我想在字段中搜索特定值,并获得与此搜索查询匹配的结果列表。问题是我想要一个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,但看起来效果相同。
任何人都知道如何解决这个问题,或者这是不可能的?
答案 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 by
和having
:
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
为一个值或另一个值,但不是两者。
答案 2 :(得分:0)
首先:我会选择最简单的方法。如果Prerak 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
的更多信息