检查表中是否存在id列表但是具有不同的组

时间:2014-03-08 16:08:20

标签: php mysql

我有两个表,还有一个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。

1 个答案:

答案 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 

SQLfiddle

...表示父1中的1组,父2中的2,与您的示例匹配。

如果你需要带有[1,2,2]的数组,只需在从数据库中读取时添加父numgroups次。