Причина, по которой ваш код не дает ожидаемых результатов (например, с вашими примерами данных иногда возвращаются значения, начинающиеся как с aaa
, так и bbb
, или вы можете не получить все значения, начинающиеся с aaa
) означает, что условие WHERE
оценивается для каждой строки теста2. Это означает, что для каждой строки в 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", вы не получите результатов в выходных данных для ваших образцов.