2012-02-10 29 views
5

Tôi đang thực hiện một dự án về nấu ăn với PHP (với Codeigniter) và MYSQL.Cách chọn một hàng có một cột với hai thuộc tính khác nhau?

Tôi có ba bảng:

  • Ingredients - id, name.
  • Recipe-id, name
  • ing_to_rep - recipe_id, ingredient_id (Tôi sử dụng bảng này để nắm giữ mà công thức có mà thành phần.)

truy vấn cho "nhận được tất cả công thức nấu ăn có trứng là gì (id = 64) và muối (id = 65)"

tôi đã cố gắng:

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 

Đương nhiên, nó không trả lại gì ngoài việc giúp bạn có được những gì tôi đang cố gắng làm.

Trả lời

1

Có lẽ là một cách hiệu quả hơn và một cách linh hoạt hơn, nhưng hai subquery tham gia sẽ làm:

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 

Ngoài ra có thể được thực hiện với 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

cả hai đều đang hoạt động thực sự tốt. Cảm ơn nhiều! – dhargan

+0

Giải pháp này có một bất lợi: CI (ActiveRecord) không hỗ trợ truy vấn phụ! Xem giải pháp truy vấn phụ của tôi :) – uzsolt

1

Một giải pháp khác sẽ là một cái gì đó như

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 

Tôi không chắc chắn về hiệu suất, bạn phải thử một mình.

+0

Đó là một phương pháp mới. +1 –

0

Một phương pháp subquery-miễn phí (AR CI không hỗ trợ 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 

Bạn có thể sử dụng giải pháp này CI của ActiveRecord.

Các vấn đề liên quan