嗨,刚刚注册问这个,因为我在一些研究后没有找到答案:
我的表my_table有几列,但这里只有两个:id(整数,主键,...)和子节点(包含一个或多个{"number":"number"}
的varchar,如下例所示)
id | children
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值。我试过了:
SELECT * FROM my_table
WHERE children=CONCAT('{"', my_table.id, '":"', my_table.id, '"}')
这显然没有任何回报...... 我还在搜索,但我想一些更有经验的用户会有一个解决方案:)
EDIT1:我在查询中写了'='而不是':',从来没有注意到它xD谢谢。该查询现在正确并按预期工作。
答案 0 :(得分:1)
选择ID不匹配的所有记录(您必须是冒号的符号相等):
SELECT *
FROM my_table
WHERE children NOT LIKE CONCAT('%{"', my_table.id, '":"', my_table.id, '"}%');
选择只有一对的所有记录:
SELECT *
FROM my_table
WHERE children NOT LIKE '{%{%';
如果你想要一个合成结果,以某种方式将两者结合起来: - )
答案 1 :(得分:0)
你的方法应该有用。必须有一些你缺少的其他角色。
这是另一种方法:
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 '%{%{%';
最可能的问题是字符串开头或结尾的空格(或其他字符)。这允许这些,但不允许列表中的多个项目。
答案 2 :(得分:0)
我同意非常糟糕的数据库设计通知。
您的问题可能非常简单 - 请参阅concat函数中的更改
SELECT * FROM my_table
WHERE children=CONCAT('{"', my_table.id, '":"', my_table.id, '"}')