Well, as soon as you're trying to retrieve 1 recipe, 4 tags and 4 ingredients, the question is: how do you want it? As you're going to 3 tables, and each has 4 and 4, logical is getting 16 rows: in each row, you'll have one propierty from what you look for.
Other question is if you wanted to get all of them in an only row, in that case, you'll have to group all of them in a field, if you wanted to retrieve it all at the same time:
I guess you have index tables like this:
recipe_has_tag - recipe_r_id, tag_t_id
ingredients_has_recipe - recipe_r_id, ingredient_in_id
So, what I'd do is retrieving all in a single row, concat all the fields with the name of tags and ingredients, and then in PHP explode them or show them directly, depending of what you wanted:
SELECT r.*,
GROUP_CONCAT( t.name SEPARATOR ', ' ) , GROUP_CONCAT( i.name SEPARATOR ', ')
FROM recipe r
-- Get Tags from recipe
JOIN recipe_has_tag rht ON rht.recipe_r_id = r.id
JOIN tag t ON rht.tag_t_id = t.id
-- Get Ingredients from recipe
JOIN ingredient_has_recipe ihr ON ihr.recipe_r_id = r.id
JOIN ingredients i ON ihr.ingredient_in_id = i.id
WHERE r.id = 1
GROUP BY r.id
Other way would be to have different queries according to what you wanted to get, but as long as I don't know what you're going to do with the data, I can't propose anything else.
Take into account, that I'm guessing the name of the index tables and the joins, maybe you'll have to modify the fileds to have the right name
UPDATE
According to your comment, you probably have duplicated values in your tables. The best solution would be check all the values and make a normalized table, but you may do a workaround if you change
-- Change:
GROUP_CONCAT( t.name SEPARATOR ', ' ) , GROUP_CONCAT( i.name SEPARATOR ', ')
-- by
GROUP_CONCAT( DISTINCT( t.name SEPARATOR ) ', ' ) , GROUP_CONCAT( DISTINCT( i.name ) SEPARATOR ', ')
Check the fiddle: http://sqlfiddle.com/#!2/626760/4