我希望比较同一行中2个单元格的结果。数据结构的方式基本上是这样的:
Col_A: table,row,cell
Col_B: row
我想要做的是比较Col_A' row'与Col_B' row'
相同SELECT COUNT(*) FROM MyTable WHERE Col_A CONTAINS Col_B;
示例数据:
Col_A: a=befd-47a8021a6522,b=7750195008,c=prof
Col_B: b=7750195008
Col_A: a=bokl-e5ac10085202,b=4478542348,c=pedf
Col_B: b=7750195008
我希望返回Col_A' b'之间的比较次数。和Col_B' b'是的。
答案 0 :(得分:2)
这就是我想要的:
SELECT COUNT(*) FROM MyTable WHERE Col_A LIKE CONCAT('%',Col_B,'%');
答案 1 :(得分:2)
我看到你回答了自己的问题。
SELECT COUNT(*) FROM MyTable WHERE Col_A LIKE CONCAT('%',Col_B,'%');
从性能角度来看,很好。虽然规范化是非常好主意,但在这种特殊情况下它不会提高速度。我们必须简单地从表中扫描所有字符串。问题是,如果查询总是正确的。它接受例如
Col_A: a=befd-47a8021a6522,ab=7750195008,c=prof
Col_B: b=7750195008
或
Col_A: a=befd-47a8021a6522,b=775019500877777777,c=prof
Col_B: b=7750195008
这可能是一个问题,具体取决于数据格式。解决方案非常简单
SELECT COUNT(*) FROM MyTable WHERE CONCAT(',',Col_A,',') LIKE CONCAT('%,',Col_B,',%');
但这不是结束。 LIKE中的字符串被解释,如果您可以在数据中包含%,则表示您遇到问题。这应该适用于mysql:
SELECT COUNT(*) FROM MyTable WHERE LOCATE(CONCAT(',',Col_B,','), CONCAT(',',Col_A,','))>0;
答案 2 :(得分:0)
SELECT * FROM MyTable WHERE Col_A = Col_B (AND Col_A = 'cell')
^^也许你正在寻找这个陈述。括号中的部分是可选的。 如果这不是解决方案,请向我们提供进一步的信息。
答案 3 :(得分:0)
如果列Col_a的数据格式为 table,row,cell ,那么搜索表达式将是下一个:
SELECT COUNT(*) FROM MyTable AS MT
WHERE SUBSTRING(Col_A,
INSTR(Col_A, ',b=') + 3,
INSTR(Col_A, ',c=') - INSTR(Col_A, ',b=') + 3) = Col_B
答案 4 :(得分:0)
最简单的方法是使用IN
运算符。
SELECT COUNT(*) FROM MyTable WHERE Col_A IN (Col_B);
有关IN运算符的更多信息:http://www.w3schools.com/sql/sql_in.asp
如果您知道子字符串每次都处于相同的位置,那么还有SUBSTRING()
或MID()
(取决于您正在使用的功能)函数。
MID()/ SUBSTRING()函数:http://www.w3schools.com/sql/sql_func_mid.asp
答案 5 :(得分:0)
您可以使用SUBSTRING_INDEX
从列中提取分隔字段。
SELECT COUNT(*)
FROM MyTable
WHERE Col_B = SUBSTRING_INDEX(SUBSTRING_INDEX(Col_A, ',', 2), ',', -1)
您需要调用它两次才能获得单个字段。内部调用获取前两个字段,外部调用获取该字段的最后一个字段。
请注意,如果表很大,这将是非常慢,因为它无法索引MySQL中的子字符串。如果您对模式进行规范化,那么每个字段都在一个单独的列中会好得多。