我有两个表,还有一个itemId的列表
Variable Item Ids: [2,40,41,50,53]
**parent_table**
*id | title | amount*
1 | Test1 | 2
2 | Test2 | 1
此父表设置合成的标题以及它需要的单个itemId的数量,如果groupId不是(NULL),则amount将始终为1。
**composition_table**
*id | parentId | itemId | groupId*
1 | 1 | 2 | (NULL)
2 | 2 | 40 | 1
3 | 2 | 41 | 1
4 | 2 | 50 | 2
5 | 2 | 51 | 2
6 | 2 | 53 | 2
所以我的任务是检查,如果我的itemId列表可以与composition_table中的某些关系结合起来。
itemId的有效组合可以是:[40,51],[40,50]或[41,50]等。 itemId的无效组合可以是:[40,41],[50,51]或[40]
组合必须有来自每个组的itemId。忽略无效组合,不执行任何操作。对于每个组合,应选择parent_table.id进行输出。
我希望有一个或多个SQL查询的解决方案。我已经尝试了很多,但是我喜欢不同的小组部分。
这是我的尝试:
SELECT
pt.id
FROM
parent_table pt
WHERE
pt.amount = 1
AND EXISTS (
SELECT
1
FROM
composition_table ct
WHERE
ct.parentId = pt.id
AND ct.itemId IN (2,40,41,50,53)
AND ct.groupId IN (
SELECT
GROUP_CONCAT(DISTINCT(ct.groupId))
FROM
composition_table ct
WHERE
ct.parentId = pt.id
)
)
正如你所看到的,我无法弄清楚如何在组不同的情况下检查组合是否仅输出。
我希望这是可以理解的,并且有帮助,提前感谢!
编辑:我想要获得的结果示例
parent_table.id数组
array (
1, 2, 2
)
项目ID [40,50]和[41,53]中有两种组合,请注意,当组合中使用项目ID时,不能再次使用它。
因此,如果在composition_table中存在有效关系,那么输出将是parent_table的ID。
答案 0 :(得分:0)
仍然不太确定我是否正确理解了NULL逻辑,但这是我想出的开始;
SELECT parentid, MIN(a) numgroups
FROM (
SELECT g.parentid, g.groupid, COUNT(ct.itemid) a
FROM (
SELECT DISTINCT parentid, COALESCE(groupid, 0) groupid
FROM composition_table
) g
LEFT JOIN composition_table ct
ON g.parentid = ct.parentid
AND g.groupid = COALESCE(ct.groupid, 0)
AND ct.itemid IN (2, 40, 41, 52, 53)
GROUP BY g.parentid, g.groupid
) z
GROUP BY parentid
它给出了结果;
parentid numgroups
1 1
2 2
...表示父1中的1组,父2中的2,与您的示例匹配。
如果你需要带有[1,2,2]的数组,只需在从数据库中读取时添加父numgroups
次。