如何在子查询中使用in子句

时间:2012-01-31 15:28:12

标签: mysql

我有两个表,如下,

表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)  

任何人都可以帮我吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

答案 2 :(得分: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

答案 3 :(得分:0)

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

需要在程序中使用脚本语言来完成。 sql不支持这种获取数据的方式..

您需要在字符串中加载值列表然后拆分它们,然后用它们在数据库中的值替换它们。