SELECT相交数量最多的行

时间:2019-01-14 16:12:00

标签: mysql sql

对于以下两个表

sql = "SELECT * FROM vacation LEFT JOIN user ua ON vacation_user = ua.user_id LEFT JOIN user ub ON vacation_granted_id = ub.user_id WHERE 1"
Set RS = Cn.Execute(sql)

uname = RS("ua.user_name")
gname = RS("ub.user_name")


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

我希望根据一系列食材选择最匹配的食谱。
例如,如果我要查询“牛奶,鸡蛋,盐”,我将获得recipe_id 1作为第一个结果(因为它有2个匹配项),但是如果我搜索“牛奶”,则将1或3作为第一个答案等效。
我目前的工作无法找到“最佳”选项,而是通过将每个配方的不同成分相交而只能找到“全有或全无”(ing_id_1_input是用户的输入):

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

2 个答案:

答案 0 :(得分:1)

您将执行以下操作:

select i.recipe_id
from ingredients i
where i.ingredient_name in ('milk', 'egg', 'salt')
group by i.recipe_id
order by count(*) desc;

答案 1 :(得分:1)

也许可行:

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。因此,在此列上进行排序将把最小值放在顶部。