WHERE LIKE子句中的SELECT

时间:2019-01-08 07:28:48

标签: mysql sql select subquery sql-like

我有以下SQL查询:

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

基本上,我想从test1表中选择一行,然后从test2表中找到所有记录,这些记录均以test1中 startswith 列中的字符开头。

但是此查询不会执行此操作。我要去哪里错了?

在这里查询表格

SELECT * FROM `test1`

startswith
==========
aaa 
bbb 
ccc 

SELECT * FROM `test2`

text
====
aaa3k123k12312p03edwqeq 
aaa12313fwefrwerw   
aaafwre3we4232  
bbb123123rwqe12e1   

4 个答案:

答案 0 :(得分:0)

移动子查询,然后JOIN

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

答案 1 :(得分:0)

像这样在联接中使用子选择

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,"%");

答案 2 :(得分:0)

您的代码没有给您期望的结果的原因(例如,对于示例数据,有时它返回以aaabbb开头的值,否则您可能无法获得全部以aaa开头的值是对test2的每一行评估WHERE条件。这意味着对于test2中的每一行,都会比较一个新的随机值,即使(test1中的所有值都是test2中值的开始。

解决方法是从子查询中创建派生表-以便仅对它进行一次评估-然后将JOIN使用{{ 1}}您正在使用的比较:

test2

Demo on dbfiddle

请注意,如果LIKE是“ ccc”,则示例数据的输出将没有结果。

答案 3 :(得分:-1)

您的代码似乎像这样的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), "%")