2012-11-16 55 views
1

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

例如

item 1: white,green,blue 
item 2: white,red,cyan 
item 3: red,blue,purple 
  • 用户应该从检查表
  • 白色 - >查询将返回项目选择1,2-
  • 白色&绿光>查询将仅返回项目1
+0

那是你的数据的外观您的SQL表里面? – Kyle

+0

你的表结构是什么?你需要帮助还是只是查询? – user1731782

回答

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参数的个数)。