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 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
将是一个值或另一个值,但不能同时是两个值。
首先:我会选择最简单的方法。如果 Prerak 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
我创建了一个查询,其中 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 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
将是一个值或另一个值,但不能同时是两个值。
首先:我会选择最简单的方法。如果 Prerak 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