mysql 查询从子记录中查找父项

mysql query finding parent from children records

我有两个 table。一个有程序集(Assembly),另一个table有组件(Component)。一组特定的组件创建一个组件。一些组件需要组件的多个副本。一些组件可以在不同的组件中使用。每个组件不超过八 (8) 个不同的组件。

我创建了一个连接 table AssemblyComponent,它为程序集创建了 "recipes"。

我希望能够根据一组组件进行装配。如果组件不匹配任何程序集,则应 returned.

NULL
Assembly
assemblyid INT

Component
componentid INT

AssemblyComponent
assemblyid INT
componentid INT
numberofcomponents INT

因此,我们的目标是拥有一个存储过程,该过程将采用可变数量的组件和 return 适合该组件集的程序集(对于给定的一组组件应该只有一个)。我正在使用 mysql 5.1.x 所以我无法将数组传递给存储过程。我只会创建八个 IN 参数并将未使用的参数设置为 NULL。

与实际编写过程代码相比,我更感兴趣的是使用何种查询方法。如果我的 table 结构需要更改,我也可以这样做。谢谢

这个怎么样?假设您知道相关组件的 componentid 值。

那么你可以这样做:

  SELECT COUNT(*) matching,
         assemblyid
   WHERE componentId IN (your set of componentid values)
   GROUP BY assemblyid
   ORDER BY COUNT(*) DESC
   LIMIT 1

这种东西会算出你的componentid值在每个程序集中出现了多少,然后得到匹配最多的那个。

如果此查询是应用程序中非常重要的部分并且您愿意修改模式和应用程序代码以使此查询高效且干净地工作,我建议您修改 AssemblyComponent table。让 table 的一行代表一个 assemblyid。添加 16 列 - componentid 8 列,numberofcomponents 8 列。

**AssemblyComponent**
assemblyid INT
componentid1 INT
numberofcomponents1 INT
componentid2 INT
numberofcomponents2 INT
....

在insert/update进入这个table时你必须确保componentid是从左到右连续排列的。在查询时,您必须再次确保 componentid 参数的排序相似。现在您的查询是一个带有 WHERE 子句的简单 SELECT 查询,例如:

WHERE
      componentid1=componentid1arg 
  AND numberofcomponents1=numberofcomponents1arg
  AND componentid2=componentid2arg 
  AND numberofcomponents2=numberofcomponents2arg
....

需要修改以上查询以正确比较空值(= 可能不适用于空值)。确保 componentid 订单可以在代码中或通过存储过程完成。

如果这些更改太多,并且您宁愿使用简单的架构并在进行匹配时处理复杂的存储过程,那么需要采用不同的方法。