SQL / MYSQL вывести весь набор, если один или несколько совпадают - PullRequest
0 голосов
/ 28 февраля 2019

Как я могу извлечь весь идентификатор таблицы 1, если установлено одно или несколько значений?

По примеру:

Таблица 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

Благодаря кому-то, кто может мне помочь, очевидно, что это упрощенный запрос, потому что исходный запрос намного длиннее и не имеет отношения к запросупомощь.

Николас

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Большое спасибо, оно работало с одним значением, но не со многими, за исключением случаев, когда значения правильно упорядочены.

Я нашел с помощью правильного решения: здесь

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) )

Теперь это работает:)

0 голосов
/ 01 марта 2019

Функция 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

Тест на rextester здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...