我有两张桌子。一个具有程序集(Assembly),另一个表具有组件(Component)。一组特定的组件创建一个组件。某些程序集需要组件的多个副本。某些组件可用于不同的组件。每个组件不超过八(8)个不同的组件。
我创建了一个连接表AssemblyComponent,用于创建"配方"用于装配。
我希望能够根据一组组件提出装配。如果组件与任何程序集都不匹配,则应返回NULL。
def item_copy(request, id):
new_item = get_object_or_404(MyModel, pk = id)
new_item.pk = None #autogen a new pk (item_id)
new_item.name = "Copy of " + new_item.name #need to change uniques
form = MyForm(request.POST or None, instance = new_item)
if form.is_valid():
form.save()
return redirect('my_view')
context = {
"form": form,
#other context
}
return render(request, "form.html", context)
因此,我们的目标是拥有一个存储过程,该过程将采用可变数量的组件并返回适合组件集的程序集(对于给定的组件集应该只有一个)。我使用的是mysql 5.1.x,因此我无法将数组传递给存储过程。我只想创建8个IN参数并将未使用的参数设置为NULL。
我对使用什么查询方法更感兴趣,而不是在此时实际编写过程代码。如果需要更改我的表结构,我也可以这样做。感谢。
答案 0 :(得分:1)
如果此查询是应用程序中非常重要的一部分,并且您愿意修改架构和应用程序代码以使此查询高效且干净地工作,我建议您修改{{1} }表。使表格的一行代表一个AssemblyComponent
。添加16列 - assemblyid
为8列,相应componentid
为8列。
numberofcomponents
在插入/更新到此表时,您必须确保**AssemblyComponent**
assemblyid INT
componentid1 INT
numberofcomponents1 INT
componentid2 INT
numberofcomponents2 INT
....
从左到右排成一行。在查询时,您必须再次确保组件参数的排序方式相似。现在,您的查询是一个简单的componentid
查询,其中包含SELECT
子句,例如:
WHERE
需要修改上面的查询以正确比较空值(WHERE
componentid1=componentid1arg
AND numberofcomponents1=numberofcomponents1arg
AND componentid2=componentid2arg
AND numberofcomponents2=numberofcomponents2arg
....
可能不适用于空值)。确保=
订单可以在代码中或通过存储过程完成。
如果这些更改太多而您宁愿使用简单的架构并在进行匹配时处理复杂的存储过程,则需要采用不同的方法。
答案 1 :(得分:0)
这个怎么样?假设您知道相关组件的componentid
值。
然后你可以这样做:
SELECT COUNT(*) matching,
assemblyid
WHERE componentId IN (your set of componentid values)
GROUP BY assemblyid
ORDER BY COUNT(*) DESC
LIMIT 1
这种事情会弄清楚每个程序集中有多少组件值出现,然后得到匹配最多的组件。