如何在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”
这不起作用。
++++
我需要 IN 内的“ids_tb2”
Example Tables http://sqlfiddle.com/#!9/08cfa9/1
Ids_tb2 = 1,3,4 名称 != Fruit1,Fruit3,Fruit4
谢谢
最佳答案
您的表结构对于此任务来说并不是非常理想。在数据库设计中,您应该始终保留数据的“原子性”,即。 e.你永远不应该使用任何列中的 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`
尽管我不建议这样做。另外,您不应该为列使用保留的 SQL 名称,例如 group
,因为您始终必须使用反引号来屏蔽它们。
重访...
实际上,您最初的方法确实也有效,您只需将 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
关于mysql - 由其他列输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38956757/