問題
データテーブル(ボール)をクエリします。これは、色がオレンジで、ボールの形状が丸いですか?
データシート
解決策
オプション1
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'
オプション2(オプション1と同様)
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
をフィールドとして使用していますが、拡張する場合は、他のいくつかのフィールドを予約する必要があります。次に、クエリは、複数のフィールドの各フィールドが同時に値を満たすことです。
テーブルの設計では、ボールの属性と属性値は拡張可能です。複数の属性値を満たすアイテムは、複数回表示されます。したがって、一般的な解決策は上記の解決策1と2ですが、質問を考えてください。ボールの属性値がどんどん挿入されると、SQLの長さはどのくらいになるでしょうか。
ソリューション3(最適なソリューション)
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