2012-02-10 9 views
5

Sto facendo un progetto sulla cottura di ricette con PHP (con Codeigniter) e MYSQL.Come selezionare una riga che ha una colonna con due attributi diversi?

Ho tre tabelle:

  • Ingredients - id, name.
  • Recipe-id, name
  • ing_to_rep - recipe_id, ingredient_id (io uso questa tabella per un'azienda ricetta ha quali ingredienti.)

Qual è la query per "ottenere tutte le ricette che hanno le uova (id = 64) e sale (id = 65)"

ho provato:

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, non restituisce nulla ma ti aiuta a ottenere ciò che sto cercando di fare.

risposta

1

C'è probabilmente un modo più efficiente e un modo più flessibile, ma due subquery unisce farà:

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 

Inoltre può essere fatto 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

entrambi funzionano perfettamente. Grazie mille! – dhargan

+0

Questa soluzione ha uno svantaggio: CI (ActiveRecord) non supporta le subquery! Vedi la mia soluzione senza subquery :) – uzsolt

1

Un'altra soluzione sarebbe qualcosa di simile

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 

Non sono sicuro della prestazione, devi prova da solo

+0

Questo è un nuovo metodo. +1 –

0

Metodo senza subquery (AR del CI non supporta subquery):

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 

È possibile utilizzare questa soluzione di CI ActiveRecord.

Problemi correlati