Как запросить, есть ли в строке N строк в другом внешнем ключе? - PullRequest
1 голос
/ 14 февраля 2012

Вот общие настройки.

У меня есть таблицы Cards, Attributes и таблица соединений между ними.(Давайте назовем его Tags. Он содержит CardID и AttributeID.) Таблица Attributes в основном представляет собой просто описания, такие как HasPower, IsPoisonous, ImmuneToWater и т. Д.

Как мне поступить с запросом для всех карт, которые IsPoisonous и IsElectric?Предположим, у меня уже есть идентификаторы (13 и 45), поэтому технически таблица Attributes не обязательно должна быть частью этого SQL.Я придумал что-то подобное, но я даже не уверен, что это оптимально.

SELECT *, (COUNT * FROM Tags t WHERE t.CardID = c.CardID AND t.AttributeID IN (13, 45)) AS TagCount
FROM Cards c
WHERE TagCount = 2

Надеюсь, мой вопрос имеет смысл.По сути, представьте, что вы смотрите на веб-интерфейс;Вы просматриваете пул из ~ 5000 карт и хотите отфильтровать результаты.Итак, вы начинаете ставить флажки: «Ядовитый», «Электрический», «Невосприимчивый к воде» и т. Д. Результаты затем фильтруются на основе этих атрибутов.

Мысли?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012
SELECT *
FROM Cards
WHERE (Cards.Id IN (
    SELECT DISTINCT CardID
    FROM Tags
    WHERE AttributeID IN (13, 45)
    GROUP BY CardID
    HAVING (COUNT(AttributeID) >= 2)
))

Внутренний запрос извлекает идентификаторы CardID, которые имеют как минимум два из указанных вами атрибутов, а затем использует этот результат в качестве фильтра для извлечения фактических данных карточки во внешнем запросе.

1 голос
/ 14 февраля 2012

Несмотря на то, что вы можете использовать несколько JOIN, я рекомендую вам перепроектировать вашу БД, чтобы атрибуты были просто столбцами в таблице Cards.

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