1

我在 ac# 应用程序中有一个项目描述列表。我想要的是当我选择该列表(复选框列表)的 1 个或 2 个或多个项目描述以通过 sql 查询预测多对多表我的项目是什么(每次最小化可能的预测);

例如

item 1: white,green,blue
item 2: white,red,cyan
item 3: red,blue,purple
  • 用户应从检查列表中选择
  • white->query 将返回项目 1,2
  • white&green->query 将只返回项目 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 回答