2012-01-31 57 views
1

使用我有两个表喜欢如下,如何子句中的子查询

表1:

ID  NAME  
------ -------- 
IM-1 Pencil 
IM-2 Pen  
IM-3 NoteBook 
IM-4 Eraser 

表2:

ID  ITEM_ID  
------ -------------- 
MT-1 IM-1   
MT-2 IM-1,IM-2,IM-3  
MT-3 IM-1,IM-2,IM-4 

所需的结果是:

ID  ITEMNAME 
------ -------- 
MT-1 Pencil 
MT-2 Pencil,Pen,NoteBook 
MT-3 Pencil,Pen,Eraser 

但是,通过使用查询


SELECT T2.ID, 
      (SELECT T1.NAME 
      FROM TABLE1 AS T1 
      WHERE T1.ID IN (T2.ITEM_ID)) AS ITEMNAME 
    FROM TABLE2 AS T2 

我得到的结果是:


ID  ITEMNAME 
------ -------- 
MT-1 Pencil 
MT-2 (NULL) 
MT-3 (NULL) 

谁能帮我请?

+0

'GROUP_CONCAT'? – knittl 2012-01-31 15:31:39

+1

在数据库列中存储逗号分隔值并不好。 – 2012-01-31 15:32:15

+0

@ knittl。在OP可以连接到Table1之前,OP需要在ITEM_ID上执行“GROUP_CONCAT”的反转操作。 – 2012-01-31 15:33:34

回答

0

试试这个:

SELECT b.ID, 
     GROUP_CONCAT(a.Name) as ItemName 
FROM  Table2 b INNER JOIN Table1 a 
       ON FIND_IN_SET(a.name, b.Item_ID) 
GROUP BY b.ID 
+0

谢谢你的回复johntotetwoo。得到了我要求的结果。 – 2012-01-31 15:51:13

+0

@SangeethaKrishnan欢迎您。 – 2012-01-31 15:52:55

0
SELECT T2.ID, T1.NAME as ITEMNAME 
FROM TABLE2 AS T2 LEFT JOIN TABLE1 AS T1 ON 
    FIND_IN_SET(T1.ID,T2.ITEM_ID)>0 AND FIND_IN_SET(T1.ID,T2.ITEM_ID) IS NOT null; 
+0

谢谢你的回复。得到了我要求的结果。 – 2012-01-31 15:50:47

1

没有正常化,你可以试试这个。但是这个查询不会是SARGable,并且ypercube pointed out在db is a bad idea中存储逗号分隔列表。

SELECT T2.ID, 
     GROUP_CONCAT(T1.NAME SEPARATOR ',') 
    FROM TABLE2 AS T2 
     INNER JOIN TABLE2 AS T1 
     ON FIND_IN_SET (T1.ID , T2.ITEM_ID) 
    GROUP BY 
     T2.ID 
+0

感谢你的回复Conrad Frix。得到了我要求的结果。 – 2012-01-31 15:52:39

0

你正在寻找的是从项目列表获取项目的名称的递归的方式。

它需要在程序中使用脚本语言来完成.. SQL不支持获取数据的方式等..

你需要加载一个字符串值的列表,然后将它们分割然后将它们替换为它们在数据库中的值。

+0

感谢法赫德哈马德阿卜杜勒卡德。但我可以通过这个查询 SELECT T2.ID得到我的结果, GROUP_CONCAT(T1.NAME分离器 '') 从表2可以为T2 INNER JOIN TABLE1 AS T1 ON FIND_IN_SET(T1.ID,T2.ITEM_ID) GROUP BY T2.ID – 2012-02-02 06:58:48