問題
查詢出數據表(ball)中,滿足顏色是橙色,並且形狀是圓形的球有哪些?
數據表
解決方案
方案一
SELECT
name
FROM
ball
WHERE
NAME IN (
SELECT
NAME
FROM
ball
WHERE
attribute = 'color'
AND attribute_value = 'orange'
)
AND attribute = 'shape'
AND attribute_value = 'circle'
方案二(與方案一類似)
SELECT
a. NAME
FROM
ball AS a
JOIN ball AS b ON a. NAME = b. NAME
WHERE
a.attribute = 'color'
AND a.attribute_value = 'orange'
AND b.attribute = 'shape'
AND b.attribute_value = 'circle'
常規的表設計是將color
和shape
作為字段,但是如果要擴展就需要預留一些其他字段。那么查詢就簡單的是多個字段中每個字段,同時滿足一個值。
該表的設計中,一個球的屬性與屬性值是可擴展的。滿足多個屬性值的物品會出現多次。所以一般的解決方案就是上面的方案一與方案二,但是考慮一個問題,如果一個球的插入的屬性值越來越多的時候,我們的sql會有多長?
方案三
SELECT
NAME
FROM
(
SELECT
NAME,
count(NAME) AS count
FROM
ball
WHERE
(attribute, attribute_value) IN ( //這里很秀!
('color', 'orange'),
('shape', 'circle')
)
GROUP BY
NAME
) AS stat
WHERE
stat.count = 2