我有以下sql查询:
SELECT * FROM `test2`
WHERE text LIKE (SELECT concat(startswith,"%") from test1 ORDER BY RAND() LIMIT 1)
实际上,我想从test1表中选取一行,然后从test2表中查找以test1中startswith列中的字符开头的所有记录。
但这个查询并不能做到这一点。我哪里出错了?
这是任务中的table
SELECT * FROM `test1`
startswith
==========
aaa
bbb
ccc
SELECT * FROM `test2`
text
====
aaa3k123k12312p03edwqeq
aaa12313fwefrwerw
aaafwre3we4232
bbb123123rwqe12e1
4条答案
按热度按时间3duebb1j1#
像这样在join中使用subselect
2ic8powd2#
代码没有给出预期结果的原因(例如,对于示例数据,有时它返回以两者开头的值)
aaa
以及bbb
,或者可能无法获取以开头的所有值aaa
)那是那个吗WHERE
为test2的每一行计算条件。这意味着对于test2中的每一行,都会比较一个新的随机值,这可能会导致(潜在地)匹配所有行,或者不匹配任何行,即使test1
是中某个值的开始test2
.解决这个问题的方法是从子查询创建一个派生表—这样它只被计算一次—然后
JOIN
那是给test2
使用LIKE
您正在使用的比较:在dbfiddle上演示
注意,如果
startswith
如果是“ccc”,您的样本数据的输出将不会得到任何结果。sg24os4d3#
你的代码好像是这样的
SELECT * FROM test2WHERE text LIKE ==========%
没有报价。如果在查询中添加临时数据,它还会得到结果吗?像这样的还有这个
完成你的代码
kx7yvsdv4#
移动子查询,然后
JOIN
: