Вопрос:
Я ищу MYSQL QUERY, а не PLSQL QUERY
select * from aadhar limit (select count(*)/2 from aadhar);
Я пытался, как это, но получить эту ошибку, пожалуйста, помогите
Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с ‘ (select count(*)/2 from aadhar ) ‘ в строке 1
Лучший ответ:
Возможно, это не то, что вам нужно. but- “Внутри хранимых программ параметры LIMIT могут указываться с использованием целочисленных стандартных параметров или локальных переменных, начиная с MySQL 5.5.6”.
Если вы не хотите использовать динамический sql или хранимую процедуру, но у вас есть какой-то способ упорядочения таблицы, то может помочь имитация номера строки (до версии 8) или оконная функция row_number (версия 8 включена). Дано
+——+———-+ | id | username | +——+———-+ | 1 | aaa | | 2 | Jane | | 3 | Ali | | 6 | Bruce | | 7 | Martha | | 8 | Sidney | | 10 | charlie | | 12 | Elisa | | 14 | Samantha | | 15 | Hannah | | 16 | Hannah | | 17 | Kevin | | 999 | bob | +——+———-+ 13 rows in set (0.00 sec) SELECT S.ID,S.USERNAME FROM ( SELECT U.ID,U.USERNAME, @RN:=@RN+1 ROWNUMBER, (SELECT ROUND(COUNT(*)/2) FROM USERS) TOPN FROM USERS U CROSS JOIN (SELECT @RN:=0) R ORDER BY U.ID ) S WHERE S.ROWNUMBER <= S.TOPN;
приведет к
+—-+———-+ | ID | USERNAME | +—-+———-+ | 1 | aaa | | 2 | Jane | | 3 | Ali | | 6 | Bruce | | 7 | Martha | | 8 | Sidney | | 10 | charlie | +—-+———-+ 7 rows in set (0.00 sec) Ответ №1
Как и другие ответы, уже объясненные, LIMIT не может быть динамически установлен в запросе.
Но вы можете обойти это с пользовательской переменной MySQL в сочетании с PREPARE / EXECUTE..
SET @count = (SELECT COUNT(*)/2 FROM aadhar); SET @sql = CONCAT(‘SELECT * FROM aadhar LIMIT ‘, @count); PREPARE q FROM @sql; EXECUTE q; DEALLOCATE PREPARE q;
Или (самый безопасный вариант)
SET @count = (SELECT COUNT(*)/2 FROM aadhar); PREPARE q FROM ‘SELECT * FROM aadhar LIMIT ?’; EXECUTE q USING @count; DEALLOCATE PREPARE q;
Дополнительное предупреждение
Обратите внимание, что SQL по определению является беспорядочным. Использование LIMIT без ORDER BY имеет смысла. SQL может свободно возвращать записи, которые совпадают в любом порядке, без ORDER BY означает, что выполнение одного и того же запроса дважды может привести к другому результату.
Также лучше использовать CEIL() или CAST() который конвертирует double в int, чтобы метод не выдавал ошибку, когда таблица имеет нечетное число записей, и генерирует SQL с двойным значением, подобным SELECT * FROM aadhar LIMIT 1.500000000
посмотрите демо о том, как это сделать
Ответ №2
В MySQL нет положения, позволяющего выбирать и отображать половину всех записей в таблице, пока вы не укажете скаляр в выражении LIMIT явно.