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

时间:2017-06-01 11:30:42

标签: mysql sql

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

我的表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谢谢。该查询现在正确并按预期工作。

3 个答案:

答案 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, '"}')