在where-like子句中选择

deyfvvtc  于 2021-06-15  发布在  Mysql
关注(0)|答案(4)|浏览(277)

我有以下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
3duebb1j

3duebb1j1#

像这样在join中使用subselect

select t2.* from test2 as t2 join (SELECT RAND() as rand, startswith from test1 ORDER BY rand LIMIT 1) as t1 where t2.txt like CONCAT(t1.startswith,"%");
2ic8powd

2ic8powd2#

代码没有给出预期结果的原因(例如,对于示例数据,有时它返回以两者开头的值) aaa 以及 bbb ,或者可能无法获取以开头的所有值 aaa )那是那个吗 WHERE 为test2的每一行计算条件。这意味着对于test2中的每一行,都会比较一个新的随机值,这可能会导致(潜在地)匹配所有行,或者不匹配任何行,即使 test1 是中某个值的开始 test2 .
解决这个问题的方法是从子查询创建一个派生表—这样它只被计算一次—然后 JOIN 那是给 test2 使用 LIKE 您正在使用的比较:

SELECT t2.*
FROM (SELECT startswith FROM test1 ORDER BY RAND() LIMIT 1) t1
JOIN test2 t2 ON t2.text LIKE CONCAT(t1.startswith, '%')

在dbfiddle上演示
注意,如果 startswith 如果是“ccc”,您的样本数据的输出将不会得到任何结果。

sg24os4d

sg24os4d3#

你的代码好像是这样的 SELECT * FROM test2WHERE text LIKE ==========% 没有报价。如果在查询中添加临时数据,它还会得到结果吗?像这样的

SELECT * FROM `test2`
WHERE text LIKE aaa%  -->> will not run, should have quotations

还有这个

SELECT * FROM `test2`
WHERE text LIKE 'aaa%'

完成你的代码

SELECT * FROM `test2`
WHERE text LIKE Concat((SELECT startswith from test1 ORDER BY RAND() LIMIT 1), "%")
kx7yvsdv

kx7yvsdv4#

移动子查询,然后 JOIN :

SELECT text
FROM `test2`
JOIN (select startswith from test1 ORDER BY RAND() LIMIT 1) t1
    ON text LIKE concat(startswith,"%")

相关问题