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 值同时以 aaa
和 bbb
开头,或者您可能无法获得以 aaa
开头的所有值)是因为 WHERE
条件被评估为 for each row of test2.这意味着对于 test2 中的每一行,将与一个 new, random 值进行比较,这可能导致(可能)匹配所有行,或 none,即使所有值test1
是 test2
.
中值的开始
解决这个问题的方法是从您的子查询创建一个派生的 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, '%')
请注意,如果 startswith
是 "ccc",您将不会在示例数据的输出中得到任何结果。
我有以下 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 值同时以 aaa
和 bbb
开头,或者您可能无法获得以 aaa
开头的所有值)是因为 WHERE
条件被评估为 for each row of test2.这意味着对于 test2 中的每一行,将与一个 new, random 值进行比较,这可能导致(可能)匹配所有行,或 none,即使所有值test1
是 test2
.
解决这个问题的方法是从您的子查询创建一个派生的 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, '%')
请注意,如果 startswith
是 "ccc",您将不会在示例数据的输出中得到任何结果。