如果一个或多个匹配,SQL/MYSQL将弹出整个集合

如果一个或多个匹配,SQL/MYSQL将弹出整个集合,mysql,join,mariadb,Mysql,Join,Mariadb,如果一个或多个值与集合匹配,如何弹出整个表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.aller

如果一个或多个值与集合匹配,如何弹出整个表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
如果一个或多个值与过敏原行匹配,我想弹出结果“milk”@ID=1,以获得该结果:

2  | Soy Milk | 4
感谢有人能帮助我,显然这是一个简化的请求,因为原来的请求要长得多,与请求帮助无关

Nicolas

该函数可用于在逗号分隔的字符串中查找字符串。
如果找不到,则返回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
在rextester上进行测试

非常感谢, 它只使用一个值,但不使用多个值,除非值的顺序正确

我在帮助下找到了正确的解决方案:

现在它起作用了:)

SELECT
 p.id,
 p.name
FROM
 local_product p
WHERE
 p.id NOT IN ( SELECT local_product_id FROM local_product_allergen WHERE allergen_id IN (1,2) )