1

ac# アプリケーションに商品説明のリストがあります。私が欲しいのは、そのリスト(チェックボックスリスト)の1つまたは2つ以上のアイテムの説明を選択して、多対多のテーブルへのSQLクエリを介して、アイテムが何であるかを予測することです(可能な予測を毎回最小限に抑えます)。

例えば

item 1: white,green,blue
item 2: white,red,cyan
item 3: red,blue,purple
  • ユーザーはチェックリストから選択する必要があります
  • white-> クエリは項目 1,2 を返します
  • white&green-> クエリは項目 1 のみを返します
4

1 に答える 1

2

問題の謙虚な説明から、次のようなものが必要だと思います。

 CREATE TABLE items (
    item_id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    name VARCHAR(100) NOT NULL
)

CREATE TABLE colors (
    color_id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    name VARCHAR(100) NOT NULL
)

CREATE TABLE items_colors (
    item_id INT NOT NULL FOREIGN KEY REFERENCES items(item_id),
    color_id INT NOT NULL FOREIGN KEY REFERENCES colors(color_id),
    PRIMARY KEY(item_id, color_id),
)

INSERT INTO items(name) VALUES ('item 1')
INSERT INTO items(name) VALUES ('item 2')
INSERT INTO items(name) VALUES ('item 3')

INSERT INTO colors(name) VALUES ('white')
INSERT INTO colors(name) VALUES ('green')
INSERT INTO colors(name) VALUES ('blue')
INSERT INTO colors(name) VALUES ('red')
INSERT INTO colors(name) VALUES ('cyan')
INSERT INTO colors(name) VALUES ('purple')

INSERT INTO items_colors(item_id, color_id) VALUES (1, 1)
INSERT INTO items_colors(item_id, color_id) VALUES (1, 2)
INSERT INTO items_colors(item_id, color_id) VALUES (1, 3)

INSERT INTO items_colors(item_id, color_id) VALUES (2, 1)
INSERT INTO items_colors(item_id, color_id) VALUES (2, 4)
INSERT INTO items_colors(item_id, color_id) VALUES (2, 5)

INSERT INTO items_colors(item_id, color_id) VALUES (3, 3)
INSERT INTO items_colors(item_id, color_id) VALUES (3, 4)
INSERT INTO items_colors(item_id, color_id) VALUES (3, 6)

SELECT i.* 
FROM items i 
WHERE 2 = (
    SELECT COUNT(*)
    FROM items_colors ic
    JOIN colors c
    ON ic.color_id = c.color_id
    WHERE i.item_id = ic.item_id
    AND c.name IN ('white', 'green')
)

「IN」句内で、ユーザーが UI で選択した値のリストを提供する必要があります (パラメーターのリストを動的に作成する必要があります)。また、ユーザーが選択した要素の数を指定する必要があります (私の例のソリューションでは「2」)。

したがって、アプリケーション内のクエリは次のようになります。

SELECT i.* 
FROM items i 
WHERE @count = (
    SELECT COUNT(*)
    FROM items_colors ic
    JOIN colors c
    ON ic.color_id = c.color_id
    WHERE i.item_id = ic.item_id
    AND c.name IN (@color1, @color2, ..., @colorN)
)

(@count は @colorX パラメータの数です。)

于 2012-11-16T20:51:08.527 に答える