首页 > 解决方案 > SQL / MYSQL 如果一个或多个匹配则弹出整个集合

问题描述

如果设置了一个或多个值匹配,我如何弹出整个表 1 id?

按照示例:

表 1 称为“产品”,表 2 称为“过敏原”。

每个表都有多对多的关系(许多产品可以有许多过敏原)。

我提出以下要求:

SELECT 

p.id,
p.name,
group_concat(a.allergen_id) as allergens

FROM local_product p
LEFT  JOIN local_product_allergen a ON (a.`local_product_id` = p.id AND a.allergen_id NOT IN (1,2))

WHERE 

p.name like 'milk%'

LIMIT 0,10

返回的结果是:

ID | Name     | Allergens
1  | Milk     | 3
2  | Soy Milk | 4

如果我删除条件“a.allergen_id NOT IN (1,2)”,它会返回:

1 | Milk      | 1,2,3
2 | Soy Milk  | 4

如果一个或多个值与过敏原行匹配以获得该结果,我想弹出结果“牛奶”@ID = 1:

2  | Soy Milk | 4

感谢可以帮助我的人,显然这是一个简化的请求,因为原始请求要长得多,并且与寻求帮助无关。

尼古拉斯

标签: mysqljoinmariadb

解决方案


函数find_in_set可用于在逗号分隔的字符串中查找字符串。
如果没有找到则返回 0。

如果进行分组,则可以在 HAVING 子句中使用它来根据 GROUP_CONCAT 的结果进行过滤。

SELECT 
p.id,
p.name,
group_concat(a.allergen_id) as allergens
FROM local_product p
LEFT JOIN local_product_allergen a
  ON a.local_product_id = p.id
WHERE p.name like '%milk%'
GROUP BY p.id, p.name
HAVING find_in_set(p.id, allergens) = 0

对reextester 的测试在这里


推荐阅读