MySQL запрос на выборку из объединенной таблицы, имеющей точное количество дочерних строк - PullRequest
0 голосов
/ 25 октября 2018

У меня есть две таблицы, как показано ниже.

PermissionAccessEntities


peID      |   petID
-------------------
1         |   1
2         |   4
3         |   1
4         |   2
5         |   4
6         |   4
-------------------

PermissionAccessEntityGroups


pegID     |   peID     |  gID
-----------------------------
1         |   5        |  1
2         |   5        |  2
3         |   5        |  3
4         |   6        |  2
5         |   6        |  3
-----------------------------

Теперь у меня есть 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 для получения того же набора результатов, что и выше?

Помощь очень важна.

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вы можете достичь желаемого результата, сначала посмотрев записи, которые соответствуют (2,3), а затем посмотрев, совпадают ли какие-либо из них с одним из других значений.Любое, что не (paeg2.peID IS 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

Демо на dbfiddle

0 голосов
/ 25 октября 2018
SELECT pae.peID FROM PermissionAccessEntities pae 
INNER JOIN PermissionAccessEntityGroups paeg1 ON  pae.peID=paeg1.peID
WHERE pae.petID = 4 AND paeg1.peID NOT IN (SELECT DISTINCT peID FROM 
PermissionAccessEntityGroups WHERE gID NOT IN (2,3));
0 голосов
/ 25 октября 2018
  • Where условие не поможет вам в этом случае.Потому что вы хотите учесть количество всех строк для дальнейшей фильтрации.Вам нужно будет использовать Group By с условной фильтрацией, используя предложение Having.
  • Мы также можем упростить запрос, чтобы использовать только одно объединение с таблицей PermissionAccessEntityGroups.
  • *Функция 1011 * используется для подсчета количества строк в группе.Мы также можем использовать Sum( conditional statements ) для подсчета количества строк, соответствующих условию.Условный оператор вернет 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))

DB Fiddle DEMO


Теперь запомните, что Count(NULL) = 0;однако COUNT(0) = COUNT(1) = 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)

DB Fiddle DEMO 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...