2012-02-10 6 views
5

Estoy haciendo un proyecto sobre recetas de cocina con PHP (con Codeigniter) y MYSQL.¿Cómo seleccionar una fila que tiene un coloumn con dos atributos diferentes?

Tengo tres tablas:

  • Ingredients - id, name.
  • Recipe-id, name
  • ing_to_rep - recipe_id, ingredient_id (se usa esta tabla para la explotación que receta tiene los ingredientes.)

¿Cuál es la consulta para "obtener todas las recetas que tienen los huevos (id = 64) y sal (id = 65)"

traté:

SELECT * FROM recipe JOIN ing_to_rep ON recipe.id = ing_to_rep.rep_id 
WHERE ing_to_rep.ing_id = 64 AND ing_to_rep.ing_id = 65 

Naturalmente, no devuelve nada, pero te ayuda a obtener lo que intento hacer.

Respuesta

1

Existe probablemente una manera más eficiente y de una manera más flexible, pero dos sub consulta se une hará:

SELECT 
    recipe.* 
FROM recipe 
    JOIN (SELECT recipe_id FROM ing_to_rep WHERE ingredient_id = 64) AS ing1 ON recipe.id = ing1.recipe_id 
    JOIN (SELECT recipe_id FROM ing_to_rep WHERE ingredient_id = 65) AS ing2 ON recipe.id = ing2.recipe_id 

También se puede hacer con EXISTS

SELECT 
    recipe.* 
FROM 
    recipe 
WHERE 
    EXISTS (SELECT recipe_id FROM ing_to_rep ing1 WHERE ingredient_id = 64 AND recipe.id = ing1.recipe_id) 
    AND EXISTS (SELECT recipe_id FROM ing_to_rep ing2 WHERE ingredient_id = 65 AND recipe.id = ing2.recipe_id) 
+0

estos dos funcionan muy bien. ¡muchas gracias! – dhargan

+0

Esta solución tiene una desventaja: ¡CI (ActiveRecord) no admite subconsultas! Ver mi solución sin subconsulta :) – uzsolt

1

Otra solución sería algo así como

SELECT * FROM recipe r JOIN 
(SELECT recipe_id FROM ing_to_rep 
GROUP BY recipe_id 
HAVING SUM(IF(ingredient_id IN (64, 65), 1, 0)) = 2) gr ON r.id = gr.recipe_id 

No estoy seguro del rendimiento, tiene que prueba por ti mismo.

+0

Ese es un método novedoso. +1 –

0

Un método libre de subconsulta (AR de CI no soporta sub consulta):

SELECT * 
FROM recipe 
JOIN ing_to_rep ON (ing_to_rep.id_recipe=recipe.id AND (ing_to_rep.ing_id=64 OR ing_to_rep.ing_id=65)) 
GROUP BY recipe.id 
HAVING COUNT(ing_to_rep.ing_id)=2 

Puede utilizar esta solución de CI ActiveRecord.

Cuestiones relacionadas