Как сгруппировать данные из отношения 1-многие в одном запросе с использованием MySQL?

0

У меня есть 3 таблицы, рецепты, recipes_instructions, recipes_ingredients, первая - основная, а остальная часть - recipe_id из таблицы рецептов.

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

Это мой желаемый результат:

Array
(
    [id] => 1
    [title] => Citrus Shortbread Cookies
    [instruction_group] => Array (
        [0] => Divide the dough into 2 equal portions...
        [1] => Preheat an oven to...
        [2] => Remove wax paper, and...
        [3] => Bake in the preheated oven...
    )
    [ingredients_group] => Array (
        [0] => 1 cup (230g) butter
        [1] => 1 teaspoon vanilla extract
        [2] => 2 cups (250g) all-purpose flour
        [3] => Zest of one lime
        [4] => 1/2 cup (65g) icing sugar
    )
)

Что я пробовал:

1: Это самое близкое, что я получил к тому, что я хочу, он все еще имеет повторяющиеся результаты и извлекает все данные из базы данных даже из идентификатора рецепта, который не был указан.

http://sqlfiddle.com/#!9/725468/33

SELECT *
  FROM recipes 
INNER JOIN
  (SELECT recipe_id, GROUP_CONCAT(instruction) instruction_group FROM recipe_instructions) 
  as instructionscombined 
  on recipes.id = instructionscombined.recipe_id
INNER JOIN 
  (SELECT recipe_id, GROUP_CONCAT(ingredients) ingredient_group FROM recipe_ingredients)
  as ingredientscombined
  on recipes.id = ingredientscombined.recipe_id
WHERE recipes.id = 1

2: Дублирующие результаты, все данные из таблицы были возвращены даже из тех, что идентификатор рецепта не был указан.

http://sqlfiddle.com/#!9/725468/39

SELECT *, GROUP_CONCAT(inst.instruction), GROUP_CONCAT(ingr.ingredients) FROM recipes 
INNER JOIN recipe_instructions as inst on recipes.id = inst.recipe_id
INNER JOIN recipe_ingredients as ingr on recipes.id = ingr.recipe_id
WHERE recipes.id = 1

EDIT: Что касается вопроса, что запросы возвращали все данные из строк, это потому, что я не был явным внутри вложенных выборок.

Это решило проблему, но я все равно получаю дубликаты столбцов recipe_id

http://sqlfiddle.com/#!9/725468/64

SELECT *
  FROM recipes 
INNER JOIN
  (SELECT recipe_id, GROUP_CONCAT(instruction) instruction_group 
   FROM recipe_instructions
   WHERE recipe_id = 1
  )
  as instructionscombined 
  on recipes.id = instructionscombined.recipe_id
INNER JOIN 
  (SELECT recipe_id, GROUP_CONCAT(ingredients) ingredient_group 
   FROM recipe_ingredients
   WHERE recipe_id = 1
  )
  as ingredientscombined
  on recipes.id = ingredientscombined.recipe_id
WHERE recipes.id = 1
GROUP BY recipes.id

ВТОРОЙ РЕДАКТИРОВАНИЕ:

Итак, что я узнал, так это то, что mysql не имеет возможностей массива, поэтому пока что я делаю это, я использую указанный выше запрос и разделяю group_concat с помощью GROUP_CONCAT (инструкции SEPARATOR\'__ \') ( Мне пришлось сбежать из "с тех пор, как я использую php), а затем запустить цикл while и взломать группу.

Теги:

1 ответ

1
Лучший ответ

Попробуйте:

SELECT 
    a.*,
    GROUP_CONCAT(DISTINCT b.instruction ORDER BY b.instruction_id) as 'instructions',
    GROUP_CONCAT(DISTINCT c.ingredients ORDER BY c.ingredient_id) as 'ingredients'
FROM recipes a
JOIN recipe_instructions b
ON a.id = b.recipe_id
JOIN recipe_ingredients c
ON a.id = c.recipe_id
GROUP BY a.id
ORDER BY a.title

Здесь SQL-скрипт с этим запросом.

  • 0
    @ Джонсон: Если это работает для вас, пожалуйста, примите ответ.
  • 0
    Я даже не получил уведомление об этом комментарии, но я все же видел ответ. Это прекрасно, я многому научился из этого, и я много значу. Спасибо. У меня есть еще один вопрос, если вы сможете мне помочь, когда у вас есть время, я буду отмечать вас на всякий случай. :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню