Mysql 变量等于WHERE子句中当前行-列值的SQL请求

Mysql 变量等于WHERE子句中当前行-列值的SQL请求,mysql,sql,Mysql,Sql,嗨,我刚注册问这个问题,因为我在一些研究后没有找到答案: My table My_table有几列,但这里只有两个内容:id integer、主键。。。以及包含一个或多个{number:number}的子变量varchar,如下面的示例所示 id |儿童 0 | {0:0} 1 | {1:1} {2:2} {3:3} 2 | {2:2} 3 | {3:3} 4 | {4:4} 5 | {5:5} {6:6} 6 | {6:6} 您可以看到,对于任何已选择的行,列子级将始终至少包含一

嗨,我刚注册问这个问题,因为我在一些研究后没有找到答案:

My table My_table有几列,但这里只有两个内容:id integer、主键。。。以及包含一个或多个{number:number}的子变量varchar,如下面的示例所示

id |儿童 0 | {0:0} 1 | {1:1} {2:2} {3:3} 2 | {2:2} 3 | {3:3} 4 | {4:4} 5 | {5:5} {6:6} 6 | {6:6} 您可以看到,对于任何已选择的行,列子级将始终至少包含一次{number:number},其中'number'等于此行的列id值

有时,它包含一个以上的{number:number}与其他行id的编号

我想构建一个返回所有行的SQL查询:

其中子列中只出现一次{number:number} 对于每一行,验证{number:number}中的值'number'是否等于该行的id值。 我试过:

从my_表中选择* 其中children=CONCAT'{',my_table.id',:',my_table.id',} 这显然没有任何回报。。。 我仍在搜索,但我想一些更有经验的用户会有一个解决方案:


EDIT1:我在查询中写了“=”而不是“:”,但从未注意到它xD谢谢。查询现在是正确的,并按预期工作。

您的方法应该可以工作。你肯定还缺少其他一些字符

以下是另一种方法:

where children like '%{%' and
      children not like '%{%{%' and
      children like concat('%"', id, '":%') and
      children like concat('%:"', id, '"%')
这只是比较模式的每个部分

您也可以尝试:

WHERE children LIKE CONCAT('%{"', my_table.id, '":"', my_table.id, '"}%') AND
      children NOT LIKE '%{%{%';

最可能的问题是字符串开头或结尾的空格或其他字符。这允许这些,但不允许列表中有多个项目。

我同意非常糟糕的db设计通知

您的问题可能很简单-请参见concat函数中的更改

SELECT * FROM my_table 

WHERE children=CONCAT('{"', my_table.id, '":"', my_table.id, '"}') 

选择ID不匹配的所有记录如果您有一个等号,则它必须是冒号:

SELECT * 
FROM my_table 
WHERE children NOT LIKE CONCAT('%{"', my_table.id, '":"', my_table.id, '"}%');
选择只有一对的所有记录:

SELECT * 
FROM my_table 
WHERE children NOT LIKE '{%{%';

如果你想得到一个统一的结果,请以某种方式将两者结合起来:-

存储格式化数据的db设计非常糟糕。你在查询中将a:与a=混淆了。这不是我的数据库,我必须处理已经存在的内容。tho:/格式化数据是自动生成的,而不是人工填充的。不,问题不是空格,但是简单地说,分隔符应该是冒号而不是等号:-我选择了你的答案,因为这是导致这个错误的打字错误,谢谢你的帮助!