У меня есть 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 и взломать группу.
Попробуйте:
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-скрипт с этим запросом.