私は2つのテーブルを持っています:
CREATE TABLE `EAV` (
`subscriber_id` INT(1) NOT NULL DEFAULT '0',
`attribute_id` CHAR(62) NOT NULL DEFAULT '',
`attribute_value` CHAR(62) NOT NULL DEFAULT '',
PRIMARY KEY (`subscriber_id`,`attribute_id`)
)
INSERT INTO EAV (subscriber_id, attribute_id, attribute_value) VALUES (1,'color','red')
INSERT INTO EAV (subscriber_id, attribute_id, attribute_value) VALUES (1,'size','xl')
INSERT INTO EAV (subscriber_id, attribute_id, attribute_value) VALUES (1,'garment','shirt')
INSERT INTO EAV (subscriber_id, attribute_id, attribute_value) VALUES (2,'color','red')
INSERT INTO EAV (subscriber_id, attribute_id, attribute_value) VALUES (2,'size','xl')
INSERT INTO EAV (subscriber_id, attribute_id, attribute_value) VALUES (2,'garment','pants')
INSERT INTO EAV (subscriber_id, attribute_id, attribute_value) VALUES (3,'garment','pants')
CREATE TABLE `CRITERIA` (
`attribute_id` CHAR(62) NOT NULL DEFAULT '',
`attribute_value` CHAR(62) NOT NULL DEFAULT ''
)
INSERT INTO CRITERIA (attribute_id, attribute_value) VALUES ('color', 'red')
INSERT INTO CRITERIA (attribute_id, attribute_value) VALUES ('size', 'xl')
条件に一致する EAV 内のすべてのサブスクライバーを見つけるために、関係分割を使用します。
SELECT DISTINCT(subscriber_id)
FROM EAV
WHERE subscriber_id IN
(SELECT E.subscriber_id FROM EAV AS E
JOIN CRITERIA AS CR ON E.attribute_id = CR.attribute_id AND E.attribute_value = CR.attribute_value
GROUP BY E.subscriber_id
HAVING COUNT(`*`) = (SELECT COUNT(`*`) FROM CRITERIA))
これにより、すべての基準を持つ購読者の一意のリストが得られます。つまり、サブスクライバー 1 と 2 は、色が赤でサイズが xl を探しているため、私が戻ってくることを意味します。これがまさに私の基準です。
しかし、これを拡張してサブスクライバー 3 も取得するようにしたい場合はどうでしょう。サブスクライバー 3)。
現在の設計を考えると、クエリを拡張して、0 個以上の属性が定義されているサブスクライバーを含める方法はありますか?また、属性が定義されている場合は、基準に一致する必要がありますか?
または、クエリを支援するためにテーブルを設計するより良い方法はありますか?