MySQL одна таблица, выберите значение на основе нескольких строк - PullRequest
3 голосов
/ 01 июня 2011

Из таблицы ниже, как мне выбрать все animalIds, которые имеют определенную комбинацию attributeIds, например если бы я предоставил атрибуты 455 и 685, я бы ожидал, что вернутся AnimalIds 55 и 93

Название таблицы: animalAttributes

id      attributeId     animalId
1       455             55
2       233             55
3       685             55
4       999             89
5       455             89
6       333             93
7       685             93
8       455             93

У меня есть следующий запрос, который, кажется, работает, однако я не уверен, есть ли более надежный способ?

  SELECT animalId
    FROM animalAttributes
   WHERE attributeId IN (455,685)
GROUP BY animalId 
  HAVING COUNT(DISTINCT attributeId) = 2;

Ответы [ 3 ]

1 голос
/ 01 июня 2011

Если вы действительно хотите получить точные результаты, вы можете использовать такой надежный метод, как этот:

select distinct base.animalId
from animalAttributes base
join animalAttributes a on base.animalId = a.animalId
     and a.attributeId = 455
where base.attributeId = 685

Если вам позже понадобится 3 подходящих атрибута, вы можете просто добавить еще одно объединение:

select distinct base.animalId
from animalAttributes base
join animalAttributes a on base.animalId = a.animalId
     and a.attributeId = 455
join animalAttributes b on base.animalId = b.animalId
     and b.attributeId = 999
where base.attributeId = 685
1 голос
/ 01 июня 2011
SELECT DISTINCT `animalId` FROM `animalAttributes` WHERE `attributeId` = 455
INTERSECT
SELECT DISTINCT `animalId` FROM `animalAttributes` WHERE `attributeId` = 685
1 голос
/ 01 июня 2011
SELECT DISTINCT animalId
FROM animalAttributes
WHERE attributeId IN (455,685)

или

SELECT animalId
FROM animalAttributes
WHERE attributeId IN (455,685)
GROUP BY animalId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...