Как выбрать ресурс с условием выполнения двух отношений в объединенной таблице

0

Как выбрать ресурс, где условие принудительного использования имеет два отношения в объединенной таблице.

Например, допустим, что мне приходится указывать 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

Теги:

1 ответ

0
Лучший ответ

Другим подходом будет использование 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) соответствии с вашими входными элементами, чтобы сравнить с первым подходом, это также сложный, такой как ваш, который не будет включать. условий или нет. объединений. в то время как в первом подходе вам просто нужно подсчитывать свои входы и соответствовать в условии предложения

  • 0
    Но не даст ли этот IN мне ресурсы, у которых есть один из предметов? Мне нужно что-то, что вернет все ресурсы с навыком 1 и 2 или навыком 2 или 3
  • 0
    именно поэтому HAVING COUNT(DISTINCT i.id) = 2 используется, чтобы гарантировать, что все элементы должны существовать
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню