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, '-%')
)