我有以下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
答案 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)
您的代码没有给您期望的结果的原因(例如,对于示例数据,有时它返回以aaa
和bbb
开头的值,否则您可能无法获得全部以aaa
开头的值是对test2的每一行评估WHERE
条件。这意味着对于test2中的每一行,都会比较一个新的随机值,即使(test1
中的所有值都是test2
中值的开始。
解决方法是从子查询中创建派生表-以便仅对它进行一次评估-然后将JOIN
使用{{ 1}}您正在使用的比较:
test2
请注意,如果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), "%")