Как выбрать ресурс, где условие принудительного использования имеет два отношения в объединенной таблице.
Например, допустим, что мне приходится указывать resource
и item
где один ресурс может иметь много элементов, а элемент может быть назначен для многих ресурсов.
Теперь мне нужно выбрать ресурс, который имеет два конкретных элемента? как сделать это самым простым способом?
SELECT
r.name,
GROUP_CONCAT(DISTINCT CONCAT(i.name)) AS itemNames
FROM
resources r
LEFT JOIN resources_items ri ON ri.resourceId = r.id
LEFT JOIN items i ON i.id = ri.itemId
WHERE i.id= '1' AND i.id = '2'
GROUP BY r.id
Это хорошее направление?
Позже я хотел бы выбрать много ресурсов на основе многих элементов. Например, все ресурсы, которые имеют идентификатор в заданном массиве или имеют элемент с идентификатором 1 или 2
Другим подходом будет использование IN()
и COUNT()
SELECT
r.name,
GROUP_CONCAT(DISTINCT CONCAT(i.name)) AS itemNames
FROM
resources r
LEFT JOIN resources_items ri ON ri.resourceId = r.id
LEFT JOIN items i ON i.id = ri.itemId
WHERE i.id IN(1,2)
GROUP BY r.id
HAVING COUNT(DISTINCT i.id) = 2
Для большего количества элементов вам просто нужно обновить IN
а счет должен быть равен длине вашего массива
Этот подход специфичен для mysql, который будет использовать sum(), чтобы каждый фильтр был прав, как
SELECT
r.name,
GROUP_CONCAT(DISTINCT CONCAT(i.name)) AS itemNames
FROM
resources r
LEFT JOIN resources_items ri ON ri.resourceId = r.id
LEFT JOIN items i ON i.id = ri.itemId
WHERE i.id IN(1,2)
GROUP BY r.id
HAVING SUM(i.id = 1) > 1
AND SUM(i.id = 2) > 1
И повторите это предложение SUM(i.id = @itemInput)
соответствии с вашими входными элементами, чтобы сравнить с первым подходом, это также сложный, такой как ваш, который не будет включать. условий или нет. объединений. в то время как в первом подходе вам просто нужно подсчитывать свои входы и соответствовать в условии предложения
HAVING COUNT(DISTINCT i.id) = 2
используется, чтобы гарантировать, что все элементы должны существовать