SELECT 在 WHERE LIKE 子句中

SELECT in the WHERE LIKE clause

我有以下 SQL 查询:

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

基本上我想从 test1 table 中选择一行,然后从 test2 table 中找到所有以 startswith[= 中的字符开头的记录22=] test1 中的列。

但是这个查询并没有这样做。我哪里错了?

这里 table 正在查询

SELECT * FROM `test1`

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

SELECT * FROM `test2`

text
====
aaa3k123k12312p03edwqeq 
aaa12313fwefrwerw   
aaafwre3we4232  
bbb123123rwqe12e1   

移动子查询,JOIN:

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

你的代码好像是这样的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), "%") 

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

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

您的代码没有给您预期结果的原因(例如,有时您的示例数据 returns 值同时以 aaabbb 开头,或者您可能无法获得以 aaa 开头的所有值)是因为 WHERE 条件被评估为 for each row of test2.这意味着对于 test2 中的每一行,将与一个 new, random 值进行比较,这可能导致(可能)匹配所有行,或 none,即使所有值test1test2.

中值的开始

解决这个问题的方法是从您的子查询创建一个派生的 table - 这样它只会被计算 一次 - 然后 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, '%')

Demo on dbfiddle

请注意,如果 startswith 是 "ccc",您将不会在示例数据的输出中得到任何结果。