2014-06-26 36 views
0

我有两个表项,条件与下面分贝结构在MySQL数据库所需的输出需要查询

ITEM => 
    ID - INTEGER 
    ITEM_NAME - VARCHAR 

CONDITION => 
    CID - INTEGER 
    COND_NAME - VARCHAR 
    ITEM_ARRAY - VARCHAR (Stores all ITEM ID's separated by space 
         like: 1 5 9 17 18 

CID COND_NAME IEM_ARRAY 

1 C1   1 5 9 

2 C2   9 17 18 

3 C3   3 7 11 

在我的前端部位应用中,我们已经给出选项,用户可以选择基于一个或多个项目我们必须简短列出建议的项目

为此,我们创建了一个ITEM_ARRAY列,它将相关ITEMS的信息按数组分隔。

我需要一个查询来根据CONDITION表的相关ITEMS列出ITEM表中的所有ITEM_NAME。例如,如果用户选择1和9,那么我们必须显示ITEM ID(5 17 18)及其相应的ITEM NAME。喜欢这个。

ID | ITEM_NAME 
---+----------- 
5 | SOME ITEM1 
17 | SOME ITEM2 
18 | SOME ITEM3 

我试着写一个查询

SELECT SUBSTRING(s.ITEM,2, LENGTH(s.ITEM)) 
FROM (SELECT REPLACE(ITEM_ARRAY," ",",") as ITEM 
     FROM `CONDITION` 
     WHERE ITEM like "% 1 5 %") s 

上面的查询显示我的所有相关ITEM_ARRAY从条件表列表中,如果用户选择1到5,但如果用户选择像1一些不同的值, 9或1,17,18类ITEMS然后我的查询无法列出相关项目。

我如何获得所有相关的值。我们可以自由地对表结构进行一些更改,而不会有数据冗余。

请提出宝贵的建议,以解决问题。如果触发器等其他概念可以帮助我们,请引导我。

回答

1

我觉得你最好的选择是重新设计的CONDITION表所以它没有单个ITEM ARRAY中的所有ITEM ID - 您应该有一个而不是每个ITEM ID的行。在这种情况下,你应该正常化的数据位,例如:

CREATE TABLE cond (
CID INT PRIMARY KEY AUTO_INCREMENT, 
COND_NAME VARCHAR(128)); 

CREATE TABLE condition_items (
CID INT, 
ITEM_ID INT); 

INSERT INTO cond VALUES (1,'C1'); 
INSERT INTO condition_items VALUES (1,1),(1,5),(1,9); 

INSERT INTO cond VALUES(2,'C2'); 
INSERT INTO condition_items VALUES (2,9),(2,17),(2,18); 

如果你正使用InnoDB,那么你可以使用外键强制执行的完整性:

ALTER TABLE condition_items ADD FOREIGN KEY (CID) REFERENCES cond (CID); 

这将允许非常简单连接来在表格之间执行。

SELECT item_id,item_name 
FROM cond 
JOIN condition_items USING (CID) 
JOIN item ON (item.id=condition_items.item_id) 
WHERE cond_name="C2"; 

请注意,您应该避免使用CONDITION作为表名,因为它是保留字。

+0

感谢您回答vhu上面的结构更改在select语句中发生了一些小改动后为我工作,即SELECT ITEM_ID FROM'condition_items' C2 WHERE C2.CID IN(SELECT DISTINCT c.CID as CID FROM'condition_items' c WHERE ITEM_ID IN(5 ,9,17))。感谢您的帮助。 – user3770778

0

如果你可以改变你的表格结构,你应该将ITEM_ARRAY移动到它自己的表格中。

COND_ITEM => 
    COND_ID => INTEGER (foreign key to CONDITION table) 
    ITEM_ID => INTEGER (foreign key to ITEM table) 

然后你就可以使用查询:

SELECT ID, ITEM_NAME 
FROM ITEM 
WHERE ID IN (
SELECT ITEM_ID 
    FROM COND_ITEM 
    WHERE COND_ID IN (
     SELECT COND_ID 
     FROM COND_ITEM 
     WHERE ITEM_ID IN (1, 9) 
    ) AND ITEM_ID NOT IN (1, 9) 
) 

或JOIN:

SELECT DISTINCT i.ID, i.ITEM_NAME 
FROM ITEM AS i 
JOIN COND_ITEM AS ci1 ON ci1.ITEM_ID = i.ID 
JOIN COND_ITEM AS ci2 ON ci1.COND_ID = ci2.COND_ID 
WHERE ci1.ITEM_ID NOT IN (1, 9) 
AND ci2.ITEM_ID IN (1, 9) 

DEMO

+0

感谢您回答Barmar。 – user3770778