mysql - 由其他列输入

标签 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”

这不起作用。

++++

我需要 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/

相关文章:

php - 在php中使用系统函数返回变量中的mysql错误

MySQL 通过 where 子句计算多行

sql - 使用选择和覆盖空值插入或更新

最近在分区上使用 row_number() 的 SQL

mysql - 如何计算每学期的营业额

mysqldump整个结构,但仅在单个命令中选择表中的数据

php - 使用 MySQL WHERE 子句

mysql - 大型 SQL 数据库删除重复行

sql - 在 WITH 子句中使用多个 UNION ALL 语句

php - 如何减去两个 MySQL SELECT 语句