0

SQLクエリを作成しようとしている複雑なデータベース構造があります。まず、テーブルの構造:

Table ANIMALS:
+---------+--------+
|    id   |  name  |
+---------+--------+
|    1    | Tiger  |
|    2    | Lion   |
|    3    | Cat    |
+---------+--------+


Table ANIMAL_ATTRIBUTES:
+---------------+-----------+
| attribute_id  | animal_id |
+---------------+-----------+
|            10 |         1 |
|            11 |         3 |
|            12 |         3 |
+---------------+-----------+



Table ATTRIBUTE_TEXT:
+--------------+-- ----------+
| attribute_id |    value    |
+--------------+-------------+
|           10 |  black      |
|           11 |  big        |
|           12 |  tail       |
+--------------+-------------+


Table INFORMATION:
+---------------+-----------+
| attribute_id  | filter_id |
+---------------+-----------+
| 10            |    20     |
| 11            |    21     |
| 12            |    22     |
+---------------+-----------+


Table FILTER:
+-----------+-----------------+
| filter_id | name            |
+-----------+-----------------+
|    19     | First           |
|    20     | Second          |
|    21     | Third           |
+-----------+-----------------+

ATTRIBUTE_TEXT.value で対応する FILTER.id を確認する必要があり、この値を持つ ANIMAL を結果として指定する必要があります (追加のフィールドは問題ではありません)。これまでのところ、私はこれを得ました:

select * 
from FILTER as f join INFORMATION as i ON (f.filter_id = i.filter_id) 
                 join ATTRIBUTE_TEXT as at ON (i.attribute_id = at.attribute_id) 
                 join ANIMAL_ATTRIBUTES as aa ON (at.attribute_id = aa.attribute_id)
                 join ANIMALS as a ON (aa.animal_id = a.id) 
where (f.filter_id = 20 and at.value like '%black%');

これにより、animal.name として「TIGER」が表示されます。

問題は、対応する ATTRIBUT_TEXT.value でチェックする Filter.id がさらにあることです。

Filter 1:
Filter.id = 20 and ATTRIBUTE_TEXT.value = 'black'
and
Filter 2:
Filter.id = 21 and ATTRIBUTE_TEXT.value = 'big'

両方が正しい場合にのみ、結果として「CAT」を返す必要があります

4

2 に答える 2

2

OR適切な括弧で使用する必要があります。

select * 
from FILTER as f join INFORMATION as i ON (f.filter_id = i.filter_id) 
                 join ATTRIBUTE_TEXT as at ON (i.attribute_id = at.attribute_id) 
                 join ANIMAL_ATTRIBUTES as aa ON (at.attribute_id = aa.attribute_id)
                 join ANIMALS as a ON (aa.animal_id = a.id) 
where 
(f.filter_id = 20 and at.value like '%black%')
OR
(f.filter_id = 21 and at.value like '%big%')
于 2013-02-06T09:32:53.513 に答える
0

「CAT」を返したいが、「big」と「black」の両方である必要がある場合は、追加の動物属性 ( INSERT INTO ANIMAL_ATTRIBUTES SELECT 10,3) を追加し、次のようにクエリを使用する必要があります。

select aa.animal_id
from FILTER as f join INFORMATION as i ON (f.filter_id = i.filter_id) 
                 join ATTRIBUTE_TEXT as at ON (i.attribute_id = at.attribute_id) 
                 join ANIMAL_ATTRIBUTES as aa ON (at.attribute_id = aa.attribute_id)
                 join ANIMALS as a ON (aa.animal_id = a.id)
where 
(f.filter_id = 20 and at.value like '%black%')
OR
(f.filter_id = 21 and at.value like '%big%')
GROUP BY aa.animal_id
HAVING count(aa.attribute_id)=2
于 2013-02-06T09:50:12.563 に答える