Как выбрать строку с одним столбцом с двумя разными атрибутами? - PullRequest
5 голосов
/ 10 февраля 2012

Я делаю проект по приготовлению рецептов на PHP (с Codeigniter) и MYSQL.

У меня есть три таблицы:

  • Ingredients - id, name.
  • Recipe - id, name
  • ing_to_rep - recipe_id, ingredient_id (я использую эту таблицу для хранения того, какой рецепт содержит какие ингредиенты.)

Что такое запрос "получить все рецепты, в которых есть яйца (id = 64) и соль (id = 65)"

Я пробовал:

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

Естественно, он ничего не возвращает, но помогает вам получить то, что я пытаюсь сделать.

Ответы [ 3 ]

1 голос
/ 10 февраля 2012

Другое решение будет что-то вроде

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

Я не уверен насчет производительности, вы должны попробовать сами.

1 голос
/ 10 февраля 2012

Вероятно, есть более эффективный и более гибкий способ, но два соединения подзапроса подойдут:

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

Также можно сделать с 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 голосов
/ 13 февраля 2012

Метод без подзапроса (AR CI не поддерживает подзапрос):

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

Вы можете использовать это решение ActiveRecord CI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...