Выберите из таблицы в зависимости от записей в другой таблице - PullRequest
5 голосов
/ 27 августа 2009

Это настройка:

Таблица A имеет соединение с таблицей B. В таблице B имеется несколько записей (от 0 до n), которые могут иметь соответствующую запись в таблице A.

Как мне сформировать запрос, который дает мне запись из таблицы A, только если в таблице B существует определенное количество совпадающих записей?

Пример:

В таблице А есть одежда. Таблица B содержит атрибуты для одежды.

Таблица B имеет внешний ключ к таблице A, поэтому она будет выглядеть примерно так:

id  fid_clothing1  attributeA
id  fid_clothing1  attributeB
id  fid_clothing1  attributeC
id  fid_clothing2  attributeA
id  fid_clothing2  attributeB

Теперь мне нужна только одежда с атрибутом attributeA И attributeB И attributeC. Это не проблема, если я делаю OR-запрос, но я не могу просто сделать что-то вроде:

SELECT * from tableA
LEFT JOIN tableB on tableB.fid_cloting = tableA.id
WHERE attribute='A' AND attribute='B' AND attribute='C'

Это условие никогда не будет оцениваться как истинное. Как мне это сделать?

Ответы [ 4 ]

2 голосов
/ 27 августа 2009

Вы могли бы сделать это с 3 внутренними объединениями ... т.е. дать мне таблицу Строки, которые имеют атрибуты, которые я хочу

SELECT A.id FROM tableA A
INNER JOIN tableB BA ON A.id = BA.fid_clothing AND BA.Attribute='A'
INNER JOIN tableB BB ON A.id = BB.fid_clothing AND BB.Attribute='B'
INNER JOIN tableB BC ON A.id = BC.fid_clothing AND BC.Attribute='C'
GROUP BY A.id
1 голос
/ 27 августа 2009

Я бы использовал GROUP_CONCAT, чтобы получить один ряд всех атрибутов для данного предмета одежды:

SELECT id,GROUP_CONCAT(attribute order by attribute) as Attributes 
FROM tableB 
GROUP BY id;

Что-то вроде:

| id | Attributes |
|  1 | A,B,C      |

Из этого набора результатов вы можете выбрать те идентификаторы, для которых объединенный атрибут соответствует набору искомых атрибутов.

выберите идентификатор из MyConcatenatedResults, где атрибуты = 'A, B, C'

0 голосов
/ 27 августа 2009

Другой способ сделать это заключается в следующем: для этого требуется нулевое соединение, но вложенный подзапрос ... попытался выполнить это на фиктивной базе данных, и, похоже, он справился с этой задачей. Надеюсь, это поможет.

SELECT * 
FROM tableA A 
WHERE id IN ( 
              SELECT clothing_id
              FROM tableB B
              WHERE
                attribute =  "A"
                OR attribute =  "B"
                OR attribute =  "C"
              GROUP BY clothing_id
              HAVING count(*) = 3
            )
0 голосов
/ 27 августа 2009

Может быть, это .. надо попробовать

SELECT * FROM TABLEA a, TABLE b 
WHERE a.id = b.clothing_id 
AND a.id in (SELECT clothing_id from TABLEB where attribute = 'A' AND clothing_id = a.id
UNION select clothing_id from TABLEB where attribute = 'B' AND clothing_id = a.id
UNION select clothing_id from TABLEB where attribute = 'C' AND clothing_id = a.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...