Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL从具有确切子行数的联接表中选择查询_Mysql_Doctrine - Fatal编程技术网

MySQL从具有确切子行数的联接表中选择查询

MySQL从具有确切子行数的联接表中选择查询,mysql,doctrine,Mysql,Doctrine,我有两张桌子,如下所示 许可访问实体 PermissionAccessentityGroup 现在我有一个getOne条令查询,如下所示- select pae.peID from PermissionAccessEntities pae left join PermissionAccessEntityGroups paeg1 on pae.peID = paeg1.peID left join PermissionAccessEntityGroups paeg2 on pae.peID =

我有两张桌子,如下所示

许可访问实体

PermissionAccessentityGroup

现在我有一个getOne条令查询,如下所示-

select pae.peID from PermissionAccessEntities pae 
left join PermissionAccessEntityGroups paeg1 on pae.peID = paeg1.peID 
left join PermissionAccessEntityGroups paeg2 on pae.peID = paeg2.peID 
where petID = 4 and paeg1.gID = 2 and paeg2.gID = 3;
返回5和6。但是我想得到匹配行的精确数目。在这个例子中是6

是否有任何方法可以使用JOIN获取与上述相同的结果集

非常感谢你的帮助

在这种情况下,条件对您没有帮助。因为,您需要考虑所有行的计数以进行进一步的筛选。您将需要使用GROUPBY和Having子句进行条件筛选。 我们还可以简化查询,只使用PermissionAccessEntityGroups表的一个联接。 函数用于计算组中的行数。我们还可以使用Sum条件语句来计算与条件匹配的行数。条件语句将为匹配行返回1,为不匹配行返回0。 请尝试以下查询:

SELECT pae.peID 
FROM PermissionAccessEntities AS pae 
LEFT JOIN PermissionAccessEntityGroups AS paeg 
  ON pae.peID = paeg.peID 
WHERE pae.petID = 4
GROUP BY pae.peID
HAVING COUNT(*) = SUM(paeg.gID IN (2,3))
现在,记住CountNULL=0;然而,COUNT0=COUNT1=1。因此,仅使用Count函数编写此查询的另一种方法是:

SELECT pae.peID 
FROM PermissionAccessEntities AS pae 
LEFT JOIN PermissionAccessEntityGroups AS paeg 
  ON pae.peID = paeg.peID 
WHERE pae.petID = 4
GROUP BY pae.peID
HAVING COUNT(*) = COUNT(CASE WHEN paeg.gID IN (2,3) THEN 1 END)
在这种情况下,条件对您没有帮助。因为,您需要考虑所有行的计数以进行进一步的筛选。您将需要使用GROUPBY和Having子句进行条件筛选。 我们还可以简化查询,只使用PermissionAccessEntityGroups表的一个联接。 函数用于计算组中的行数。我们还可以使用Sum条件语句来计算与条件匹配的行数。条件语句将为匹配行返回1,为不匹配行返回0。 请尝试以下查询:

SELECT pae.peID 
FROM PermissionAccessEntities AS pae 
LEFT JOIN PermissionAccessEntityGroups AS paeg 
  ON pae.peID = paeg.peID 
WHERE pae.petID = 4
GROUP BY pae.peID
HAVING COUNT(*) = SUM(paeg.gID IN (2,3))
现在,记住CountNULL=0;然而,COUNT0=COUNT1=1。因此,仅使用Count函数编写此查询的另一种方法是:

SELECT pae.peID 
FROM PermissionAccessEntities AS pae 
LEFT JOIN PermissionAccessEntityGroups AS paeg 
  ON pae.peID = paeg.peID 
WHERE pae.petID = 4
GROUP BY pae.peID
HAVING COUNT(*) = COUNT(CASE WHEN paeg.gID IN (2,3) THEN 1 END)

通过首先查找与2,3匹配的条目,然后查看其中是否有与其他值之一匹配的条目,可以获得所需的结果。如果paeg2.peID不为NULL,则表示完全匹配:

SELECT DISTINCT(pae.peID)
FROM PermissionAccessEntities pae 
JOIN PermissionAccessEntityGroups paeg1 ON paeg1.peID = pae.peID AND paeg1.gID IN (2,3)
LEFT JOIN PermissionAccessEntityGroups paeg2 ON paeg2.peID = pae.peID AND paeg2.gID NOT IN (2,3)
WHERE pae.petID = 4 AND paeg2.peID IS NULL

通过首先查找与2,3匹配的条目,然后查看其中是否有与其他值之一匹配的条目,可以获得所需的结果。如果paeg2.peID不为NULL,则表示完全匹配:

SELECT DISTINCT(pae.peID)
FROM PermissionAccessEntities pae 
JOIN PermissionAccessEntityGroups paeg1 ON paeg1.peID = pae.peID AND paeg1.gID IN (2,3)
LEFT JOIN PermissionAccessEntityGroups paeg2 ON paeg2.peID = pae.peID AND paeg2.gID NOT IN (2,3)
WHERE pae.petID = 4 AND paeg2.peID IS NULL


您的查询没有返回您提供的样本数据的任何结果…抱歉,表数据错误。修正了。你所说的精确匹配行数是什么意思?我看不出peID=5和peID=6的结果有什么不同。@Nick对于peID=5,还有一行gID=1。看来OP只考虑那些具有GID=2和3的PEID值,PEID=5有3个GID=1,2,3和PEID=6具有2 GID=2,3。我只想得到peID=6,而不是peID=5。对于您提供的示例数据,您的查询不会返回任何结果……很抱歉,表数据错误。修正了。你所说的精确匹配行数是什么意思?我看不出peID=5和peID=6的结果有什么不同。@Nick对于peID=5,还有一行gID=1。看来OP只考虑那些具有GID=2和3的PEID值,PEID=5有3个GID=1,2,3和PEID=6具有2 GID=2,3。我只想得到peID=6,而不是peID=5。返回与OPs original完全相同的结果query@Nick不,不会的。你有小提琴吗?OP在之后更改了数据我有一个OPs新数据,您的查询给出的结果与OPs原始查询完全相同。因此,我对这个问题的第二个评论。@MadhurBhaiya&Nick是的,更新后的版本有效。非常感谢。返回的结果与原始结果完全相同query@Nick不,不会的。你有小提琴吗?OP在之后更改了数据我有一个OPs新数据,您的查询给出的结果与OPs原始查询完全相同。因此,我对这个问题的第二个评论。@MadhurBhaiya&Nick是的,更新后的版本有效。非常感谢。另一种方法。我想你也需要把pae.petID=4的地方放进去+1@Nick虽然它工作得很好,但我想知道它如何工作超过两行?例如,我有gID=1,2,3,4&想要搜索gID=1,2,3。那么我们需要另一个连接吗?@CoderBoy只需将IN条件更改为IN 1,2,3,而不是1,2,3其他方法。我想你也需要把pae.petID=4的地方放进去+1@Nick虽然它工作得很好,但我想知道它如何工作超过两行?例如,我有gID=1,2,3,4&想要搜索gID=1,2,3。那么我们需要另一个加入吗?@CoderBoy只需将IN条件改为IN 1,2,3,而不是IN 1,2,3谢谢你的回答。它返回6,但有两个条目。谢谢你的回答。它返回6,但返回两个条目。