YokiToki
@YokiToki
PHP-разработчик

Как получить записи из первой таблицы по вхождениям третей во вторую в MySQL?

Как получить записи из первой таблицы по вхождениям вторую в третей MySQL?

Имеется 3 таблицы
recipes
id | user_id | name
-----------------------
 1 | 2       | Recipe 1
 2 | 2       | Recipe 2
 8 | 2       | Recipe 8
 9 | 2       | Recipe 9


flavour_recipe
id | recipe_id | flavour_id
---------------------------
 1 | 1         | 11
 2 | 1         | 38
 3 | 2         | 23
 4 | 2         | 137
 5 | 2         | 204
 ...


flavour_user
id | user_id | flavour_id
---------------------------
 1 | 2       | 11
 2 | 2       | 15
 3 | 2       | 23
 4 | 2       | 38
 5 | 2       | 137
 6 | 2       | 204
 7 | 2       | 247


select recipe_id, GROUP_CONCAT(flavour_id) AS flavour_ids from flavour_recipe group by recipe_id


Использую GROUP_CONCAT для наглядности, просто чтобы показать чего я хочу добиться.

recipe_id | flavour_ids
---------------------------
 1        | 11,38
 2        | 23,137,204,274
 8        | 254,251,122,45
 9        | 165,254,251


select user_id, GROUP_CONCAT(flavour_id) AS flavour_ids from flavour_user where user_id = '2' group by user_id limit 1


user_id | flavour_ids
---------------------
 2      | 11,15,23,38,
        | 137,204,274


Нужно нужно получить только те рецепты на которые есть ингридиенты у юзера то есть все flavour_recipe.flavour_ids во flavour_user.flavour_ids. То есть, судя по примеру, должны быть получены рецепты c id 1, 2.
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `r`.`recipe_id` 
  FROM (
    SELECT `recipe_id`, COUNT(*) AS `count` 
      FROM `flavour_recipe` 
      GROUP BY `recipe_id`
  ) AS `r`
  JOIN (
    SELECT `r`.`recipe_id` AS `recipe_id`, COUNT(*) AS `count` 
      FROM `flavour_user` AS `u`
      JOIN `flavour_recipe` AS `r` ON `u`.`user_id` = :userId 
        AND `r`.`flavour_id` = `u`.`flavour_id`
      GROUP BY `r`.`recipe_id`
  ) AS `f` ON `f`.`recipe_id` = `r`.`recipe_id` AND `f`.`count` = `r`.`count`
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы