mysql将字符串从select转换为IN条件

mysql将字符串从select转换为IN条件,mysql,select,Mysql,Select,我有问题使语法正确。我想这样做: SELECT colum1 FROM table WHERE id=37 OR id IN (???SELECT friend_id_str FROM table where id=37 ???) 表11数据: id friend_id_str 37 1-9-12 我希望在一个查询中执行此操作,以获得与以下相同的结果: SELECT id FROM table

我有问题使语法正确。我想这样做:

   SELECT colum1 FROM table WHERE id=37 OR id IN (???SELECT friend_id_str FROM table where id=37 ???)
表11数据:

           id        friend_id_str     
           37          1-9-12
我希望在一个查询中执行此操作,以获得与以下相同的结果:

    SELECT id FROM table WHERE id=37 OR id IN (1,9,12)

要使语法正确,我需要什么字符串函数

MySQL没有可以将破折号分隔的字符串转换为数据集的函数

MySQL有一个函数FIND_IN_SET()来拯救像您这样糟糕的表设计,但它只支持在由逗号而不是破折号分隔的列表中查找子字符串

您可以使用正则表达式:

WHERE friend_id_str REGEXP CONCAT('[[:<:]]', id, '[[:>:]]')
WHERE friend\u id\u str REGEXP CONCAT(“[[::]”)
这不是你的全部疑问,但我不会为你写的。这取决于你们理解这个表达是如何工作的,并调整它来解决你们的问题

您确实应该以规范化的方式存储数据。SQL旨在将每一列视为不可约标量,而不是列表


另请参见我对

的回答。您似乎没有充分利用使用关系数据库的好处。使用多对多关系表可能会使您自己变得更容易

除此之外,你看过mysql的功能了吗

如果您有逗号分隔的好友ID,它可以立即工作,但仍然可以使用简单的
REPLACE()


我对此唯一的评论是,这将是非常低效的,如果这是一个生产查询,我将研究另一种方法。

如果您使用的是mysql,则可以使用REPLACE函数。尝试对数据进行简单的选择,如下所示:

SELECT REPLACE(friend_id_str, '-', ',') from table where id = 37;

像这样的东西可以满足你的需要。这应该可以处理friend_id_str中的任意数量的id。您只需要三个条件,就可以在第一个位置或最后一个位置正确捕获它

WHERE friend_id_str like CONCAT(id, '-', '%') or
      friend_id_str like CONCAT('%', '-', id, '-', '%') or
      friend_id_str like CONCAT('%', '-', id)

@Chris Barlow的答案可以简化为:

WHERE CONCAT('-',friend_id_str,'-') like CONCAT('%-',id, '-%') 
但我认为你想要:

select t1.*
  from table t1
exists ( select 1 from  table t2
          where  CONCAT('-',t2.friend_id_str,'-') like CONCAT('%-',t1.id, '-%') 
       )
select t1.*
  from table t1
exists ( select 1 from  table t2
          where  CONCAT('-',t2.friend_id_str,'-') like CONCAT('%-',t1.id, '-%') 
       )