ВЫБРАТЬ строку с наибольшим количеством пересечений - PullRequest
0 голосов
/ 14 января 2019

Для следующих двух таблиц

+-----------+-----------+
| recipe_id | some_data |
+-----------+-----------+
|         1 | etc       |
|         2 | etc       |
+-----------+-----------+

и

+----------------+-----------+
| ingredients_id | recipe_id |
+----------------+-----------+
|              1 |         1 |
|              1 |         2 |
|              2 |         1 |
|              2 |         3 |
+----------------+-----------+

На основе набора ингредиентов я бы хотел выбрать рецепты с наибольшим количеством совпадений.
например, если я буду запрашивать «молоко, яйцо, соль», я получу recipe_id 1 в качестве первого результата (потому что у него было 2 совпадения), но если я буду искать «молоко», получая 1 или 3, как первый ответ, будет быть эквивалентным.
Мои текущие усилия не могут найти «лучший» вариант, но только «все или ничего», пересекая различные ингредиенты в рецепте (ing_id_1_input - ввод пользователя):

select r1.*
from (
select distinct ing1.recipe_id as recipe_id
from ingredients as ing1
where ing1.ing_id=ing_id_1_input) as prod_1 join
(select distinct ing2.recipe_id
from ingredients as ing2
where ing2.ing_id=ing_id_2_input) as prod_2
on prod_1.recipe_id=prod_2.recipe_id
join recipes as r1 on r1.recipe_id=prod_1.recipe_id

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Может быть, это работает:

select r.*, (select count(*) 
               from ingredients as i1 where i1.recipe_id = r.recipe_id)
        - (select count(*) 
             from ingredients as i1 where ingredient_name in (input1,input2,input3) 
                                      and i1.recipe_id = r.recipe_id)
           as missing
 from recipe r
order by missing 

input1, input2, input3 - это 3 доступных ингредиента. Этот список может иметь переменную длину.

Последний столбец содержит количество отсутствующих ингредиентов, 0, если все ингредиенты доступны. Таким образом, сортировка по этому столбцу поместит самые маленькие значения сверху.

0 голосов
/ 14 января 2019

Вы бы сделали что-то вроде этого:

select i.recipe_id
from ingredients i
where i.ingredient_name in ('milk', 'egg', 'salt')
group by i.recipe_id
order by count(*) desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...