Mysql 查找SQL中最常同时出现的记录

Mysql 查找SQL中最常同时出现的记录,mysql,sql,Mysql,Sql,我有一张配料表: ing_id, ing_name 1 , ing1 ... 食谱表: rec_id, rec_name 1 , rec1 ... 以及显示两者之间连接的表格: id, ing_id, rec_id 1, 1, 1 2, 1, 2 3, 2, 1 4, 3, 3 ... 如何找到同一配方中最常见的成分?您可以使用自连接和分组: select c1.ing_id, c2.ing_id, count(*) from connections c1 joi

我有一张配料表:

ing_id, ing_name
1      , ing1
...
食谱表:

rec_id, rec_name
1     , rec1
...
以及显示两者之间连接的表格:

id, ing_id, rec_id
1,  1, 1
2,  1, 2
3,  2, 1
4,  3, 3
...

如何找到同一配方中最常见的成分?

您可以使用自连接和
分组:

select c1.ing_id, c2.ing_id, count(*)
from connections c1 join
     connections c2
     on c1.rec_id = c2.rec_id and c1.ing_id < c2.ing_id
group by c1.ing_id, c2.ing_id
order by count(*) desc;
选择c1.ing_id、c2.ing_id、计数(*)
从连接c1连接
连接c2
在c1.rec_id=c2.rec_id和c1.ing_id

如果您确实需要名称而不是ID,则需要另外两个联接才能将它们引入。

您可以使用自联接和
分组方式:

select c1.ing_id, c2.ing_id, count(*)
from connections c1 join
     connections c2
     on c1.rec_id = c2.rec_id and c1.ing_id < c2.ing_id
group by c1.ing_id, c2.ing_id
order by count(*) desc;
选择c1.ing_id、c2.ing_id、计数(*)
从连接c1连接
连接c2
在c1.rec_id=c2.rec_id和c1.ing_id

如果您确实需要名称而不是ID,则需要另外两个联接才能将其引入。

您最常用的含义是什么?您是否在考虑按配方列出成分组合及其数量?如果一个食谱有三种成分,那就是ing1+2,ing1+3,ing2+3。如果一个食谱有4种成分,那就是先计算ing1+2、ing1+3、ing1+4、ing2+3、ing2+4、ing3+4、ing1+2+3、ing1+2+4、ing1+3+4等,然后按最高计数排序。这就是你想要的吗?更新了示例以更好地说明问题:在上面的示例中,配料1和配料2有一个通用配方(rec_id=1),而配料1和配料3没有通用配方。成分2和3也一样。所以我们希望输出为1和2,因为这是与最常见的配方(1>0)的组合<代码>Recipe1
含有成分i1、i2和i3<代码>Recipe2
有i1、i2、i3、i4、i5<代码>交互3有i3、i4、i7、i8<代码>交互4有i3、i4、i5、i6、i7、i9、i10<代码>Recipe5包含所有i1..i10成分。您的输出是什么样子的?3和4。它们一起出现在四个配方(2,3,4,5)中,这比任何其他配方都高。您最好在SQL之外使用自己选择的编程语言进行计算。在上面的示例中,如果i2与i3位于相同的配方中,则您希望生成i2、i3和i4的输出。这意味着,你要看看哪两种以上的成分组合在所有食谱中出现得最多。你说的最常见是什么意思?您是否在考虑按配方列出成分组合及其数量?如果一个食谱有三种成分,那就是ing1+2,ing1+3,ing2+3。如果一个食谱有4种成分,那就是先计算ing1+2、ing1+3、ing1+4、ing2+3、ing2+4、ing3+4、ing1+2+3、ing1+2+4、ing1+3+4等,然后按最高计数排序。这就是你想要的吗?更新了示例以更好地说明问题:在上面的示例中,配料1和配料2有一个通用配方(rec_id=1),而配料1和配料3没有通用配方。成分2和3也一样。所以我们希望输出为1和2,因为这是与最常见的配方(1>0)的组合<代码>Recipe1含有成分i1、i2和i3<代码>Recipe2有i1、i2、i3、i4、i5<代码>交互3有i3、i4、i7、i8<代码>交互4有i3、i4、i5、i6、i7、i9、i10<代码>Recipe5包含所有i1..i10成分。您的输出是什么样子的?3和4。它们一起出现在四个配方(2,3,4,5)中,这比任何其他配方都高。您最好在SQL之外使用自己选择的编程语言进行计算。在上面的示例中,如果i2与i3位于相同的配方中,则您希望生成i2、i3和i4的输出。这意味着,你要看看哪两种以上的成分组合在所有食谱中出现得最多。这比我想象的要简单得多!这比我想象的要简单得多!