ВЫБЕРИТЕ в предложении WHERE LIKE - PullRequest
0 голосов
/ 08 января 2019

У меня следующий запрос SQL:

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

По сути, я хочу выбрать одну строку из таблицы test1, а затем найти все записи из таблицы test2, которые начинаются с символов из столбца , начинающегося с в test1.

Но этот запрос не делает этого. Куда я иду не так?

Здесь таблицы в квестах

SELECT * FROM `test1`

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

SELECT * FROM `test2`

text
====
aaa3k123k12312p03edwqeq 
aaa12313fwefrwerw   
aaafwre3we4232  
bbb123123rwqe12e1   

Ответы [ 4 ]

0 голосов
/ 08 января 2019

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

0 голосов
/ 08 января 2019

Ваш код выглядит так 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), "%") 
0 голосов
/ 08 января 2019

использовать подвыбор в объединении вот так

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,"%");
0 голосов
/ 08 января 2019

Переместить подзапрос и JOIN:

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