如何在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
答案 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