2009-08-26 14 views
5

to konfiguracja:wybrać z tablicy w zależności od pozycji w drugiej tabeli

Tabela A ma połączenie z tabeli B. Istnieje wiele wpisów (0 n) W tabeli B, która może mieć płytę dopasowanie w tabeli A.

Jak utworzyć zapytanie, które daje mi rekord z tabeli A tylko, jeśli w tabeli B istnieje pewna ilość pasujących rekordów?

Przykład:

Tabela A zawiera ubrania. Tabela B zawiera atrybuty odzieży.

Tabela B zawiera klucz obcy do tabeli A tak to będzie wyglądać mniej więcej tak:

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

Teraz chcę tylko ubrania, które mają atrybut attributeA I attributeB I attributeC. To nie jest problem, jeśli zrobię OR-maila, ale nie mogę po prostu zrobić coś takiego:

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

warunek ten nie zostanie skonwertowany na true. Jak mogę to zrobić?

+0

warto korzystać z clouse Chyba tak –

Odpowiedz

2

Można to zrobić z 3 wewnętrzna łączy ... czyli dać mi wiersze stole, których atrybuty chcę

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 
+2

Problem z tym jest to, że generalizuje słabo (co, jeśli element ubioru miał 99 atrybutów) ? – butterchicken

0

Może być to jeden .. tego spróbować

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) 
0

Innym sposobem, aby to zrobić, jest to, co wymaga zerowych sprzężeń, ale zagnieżdżone pod-zapytanie ... próbuje tego na fałszywej bazie danych i wydaje się, że wykonuje to zadanie. Mam nadzieję, że to pomoże.

 
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 
      ) 
+1

Chciałbyś dodać unikatowy klucz na ubraniu, atrybut tylko przykrył koszulkę z dwoma rękawami. – pjp

1

użyłbym GROUP_CONCAT pobrać pojedynczy wiersz wszystkich atrybutów dla danego kawałka odzieży:

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

dając coś podobnego:

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

z tego wynikowego, można wybierz te identyfikatory, dla których połączony atrybut pasuje do zestawu atrybutów, którego szukasz.

select id od MyConcatenatedResults gdzie Attributes = „A, B, C”

+0

Coś idzie wbrew normalizacji zasad, ale wygląda na to, że powinno się to wykonać. – pjp

Powiązane problemy