IN由其他专栏

时间:2016-08-15 14:11:56

标签: mysql sql

如何在IN

中添加一列

示例:

SELECT tb1.*, 
       (SELECT GROUP_CONCAT(name) 
          FROM tb2 
         WHERE id IN( tb1.ids_tb2 )) AS names
  FROM tb1

tb1.ids_tb2存储"1,2,3"

这不起作用。

++++

我需要' ids_tb2' IN内部

Example Tables http://sqlfiddle.com/#!9/08cfa9/1

Ids_tb2 = 1,3,4 名字!= Fruit1,Fruit3,Fruit4

TKS

2 个答案:

答案 0 :(得分:1)

您的表格结构不适合此任务。在数据库设计中,你应该始终保持原子性'数据,i。即你永远不应该使用任何列中的id列表。而是使用像这样的链接表lnk

| gid | fid |
|-----|-----|
|   1 |   1 |
|   1 |   3 |
|   1 |   4 |
|   2 |   1 |
|   2 |   5 |

拥有这样的结构,你可以很容易地做到

SELECT grp , GROUP_CONCAT(name) fruits 
FROM tb1 
INNER JOIN lnk ON gid=grid
INNER JOIN tb2 ON frid=fid
GROUP BY grp

请参阅here (demo)

结果将是

|  grp |               fruits |
|------|----------------------|
| Blue | Fruit1,Fruit3,Fruit4 |
|  Red |        Fruit1,Fruit5 |

话虽如此 - 您 也可以使用原始数据库设计执行以下操作(请参阅here):

SELECT tb1.id,`group`,GROUP_CONCAT(name) fruits 
FROM tb1 
INNER JOIN tb2 ON FIND_IN_SET(tb2.id,ids_tb2)>0
GROUP BY `group`

虽然我不建议这样做。此外,您不应该为group之类的列使用保留的SQL名称,因为您始终必须使用反向标记来掩盖它们。

重温......
实际上,您的初始方法也可以正常工作,您只需要通过IN (..)函数调用替换FIND_IN_SET(..)子句,如

SELECT tb1.*, 
  (SELECT GROUP_CONCAT(name) FROM tb2 
   WHERE FIND_IN_SET(tb2.id, tb1.ids_tb2)>0) names
FROM tb1

答案 1 :(得分:0)

你可以在里面做一个简单的选择。就像这样:

SELECT tb1.*, 
   (SELECT GROUP_CONCAT(name) 
      FROM tb2 
     WHERE id IN(select * from tb1.ids_tb2 )) AS names
FROM tb1