Альтернатива использованию ключевого слова LIMIT в SubQuery в MYSQL
У меня есть таблица TEST со следующими столбцами:
code_ver (VARCHAR)
люкс (VARCHAR)
дата (DATE)
Теперь я хочу выбрать 10 строк с отличным значением code_ver и code_ver NOT LIKE '% DevBld%', отсортированным по дате desc.
Итак, я написал следующий запрос:
select *
from test
where code_ver IN (select DISTINCT code_ver
from test
where code_ver NOT LIKE '%DevBld%'
ORDER by date DESC LIMIT 10);
Этот вопрос должен идеально работать, но моя версия MySQL говорит: эта версия MySQL еще не поддерживает "LIMIT и IN/ALL/ANY/SOME subquery"
Может ли кто-нибудь предложить мне альтернативу этому запросу?
Ответы
Ответ 1
Ошибка, которую вы получаете, не совсем из-за версии MySQL. Я думаю, что все версии поддерживают это. Вы должны изменить место LIMIT 10 и поместить его после ")". Дайте мне знать, если это сработает для вас. Я запустил рев один на мой, и он работает.
например.
SELECT * FROM test where name IN (
SELECT DISTINCT name
FROM projects
WHERE name NOT LIKE "%DevBld%"
ORDER by date_created DESC
) LIMIT 10;
Обновление: попробуйте один ниже, таким образом, порядок будет работать:
SELECT * FROM automation.e2e_projects WHERE name IN (
SELECT DISTINCT name
FROM automation.e2e_projects
WHERE name NOT LIKE "%DevBld%"
) ORDER by date_created DESC LIMIT 10;
Ответ 2
Ответ, предложенный Лейке, неверен в моей компетенции. Намерение использовать предел в подзапросе - это основной запрос, выполняемый по ограниченным записям, полученным из подзапроса. И если мы продолжаем ограничивать пределами, то он делает ограничение бесполезным для подзапроса.
Так как mysql еще не поддерживает ограничение в подзапросе, вместо этого вы можете использовать JOIN следующим образом:
SELECT *
FROM test JOIN (select DISTINCT code_ver
from test
where code_ver NOT LIKE '%DevBld%'
ORDER by date DESC LIMIT 10) d
ON test.code_ver IN (d.code_ver) ORDER BY xyz;
Ответ 3
Поместите подзапрос в производную таблицу:
SELECT test.*
FROM test
LEFT JOIN (SELECT DISTINCT code_ver
FROM mastertest
WHERE code_ver NOT LIKE '%DevBld%'
ORDER BY `date` DESC
LIMIT 10) d
USING (code_ver)
WHERE d.code_ver IS NOT NULL;
(Вы также можете ПРАВИЛЬНО ПРИСОЕДИНЯТЬ, что, конечно, и отказаться от внешнего условия WHERE.)