Добрый вечер! Имеется вот такой запрос: Код (Text): $query = mysqli_query($db, "SELECT MIN(`time`) AS `min` FROM `notice` WHERE `user_id` = '$user_id' ORDER BY `time` DESC LIMIT 5"); $row = mysqli_fetch_assoc($query); $time_min = $row['min']; Здесь я хотел для пользователя user_id отсортировать выборку по time по убыванию и из первых пяти строк найти минимальное значение time. Но запрос игнорирует LIMIT 5 и выдает минимальное значение из всех записей для этого user_id. Ради любопытства я заменил DESC на ASC, а результат тот же. Как решить эту проблему?
Ты можешь делать запрос не по таблице, а по подзапросу, который будет ограничен limit. Код (Text): SELECT MIN(...) FROM ( SELECT ... ORDER BY ... LIMIT 5 ) AS last_five
Попытался, но не получилось почему-то. Код (Text): $query = mysqli_query($db, "SELECT MIN(`time`) FROM (`notice` WHERE `user_id` = '$user_id' ORDER BY `time` DESC LIMIT 5) AS `min`"); $row = mysqli_fetch_assoc($query); $time_min = $row['min']; Выводит ошибку: PHP Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in … Сообщение относится к строке $row = mysqli_fetch_assoc($query);
Нужно проверять результаты всех запросов, даже если они синтаксически верны! У вас походу синт. ошибка
MIN выводит только 1 значение, даже если в таблице их несколько одинаковых, потому сколько у вас там в лимит и нисходящий порядок или восходящий все равно
Если нужно показать 5 записей с мин временем и отдельно показать мин значение, я бы сделал что-то вроде такого: Код (Text): "SELECT `time` FROM `notice` WHERE `user_id` = '$user_id' ORDER BY `time` ASC LIMIT 5" Потом средствами php нашел мин значение и показал все это пользователю. А то не очень понятно как вы хотите сделать 1 запрос таким образом, чтобы он одновременно выводил и 5 строк и 1 мин значение. Теоретически можно приделать ко всем строкам поле, где везде будет это минимальное значение, но оно нужно?
Подзапрос собирает 5 строк, а запрос из них выбирает минимальное значение. Если это за пределами возможности mysql, то с помощью РНР я могу это сделать. Но, вроде как, модератор написал, что это возможно... Вот я и пытаюсь. Пока безуспешно.
В подзапросе вы пропустили SELECT и FROM. Но вы ведь понимаете, что в итоге MIN вам даст 1 значение, а даже не 1 строку?
Так мне и нужно одно значение, я его и ищу. В PHPMyAdmin попробовал вот такой запрос, подставив в него вместо переменных их численное значение: Код (Text): SELECT MIN(`time`) AS `min` FROM `notice` (SELECT `time` FROM `notice` WHERE `user_id` = 72 ORDER BY `time` DESC LIMIT 5) Пишет Ошибка в запросе.
Тогда чем вас не устраивает: Код (Text): "SELECT MIN(`time`) FROM `notice` WHERE `user_id` = '$user_id' Или Код (Text): "SELECT `time` FROM `notice` WHERE `user_id` = '$user_id' ORDER BY `time` ASC LIMIT 1" Или вам важен подзапрос?
Как я уже писал в теме, я хотел для пользователя user_id отсортировать выборку по time по убыванию и из первых пяти строк найти минимальное значение time. Ваши варианты эту задачу не решают.
А все понял, вы хотели из 5 наибольших значений выбрать 1 наименьшее. Держите ваш запрос с подзапросом: Код (Text): SELECT MIN(`time`) FROM ( SELECT `time` FROM `notice` WHERE `user_id` = 72 ORDER BY `time` DESC LIMIT 5 ) AS `min` Сори, невнимательно прочел.
Тогда так: Код (Text): SELECT MIN(`time`) AS `min` FROM (SELECT `time` FROM `notice` WHERE `user_id` = 72 ORDER BY `time` DESC LIMIT 5) Ответ MySQL: #1248 - Every derived table must have its own alias
Радость моя была преждевременной... В PHPMyAdmin запрос исполняется и показывает нужный результат в Параметры MIN(time) 1679389366 А в скрипте результат не виден. Код (Text): $query = mysqli_query($db, "SELECT MIN(`time`) FROM (SELECT `time` FROM `notice` WHERE `user_id` = '72' ORDER BY `time` DESC LIMIT 5) AS `min`"); $row = mysqli_fetch_assoc($query); $time_min = $row['min']; Диагностика: PHP Notice: Undefined index: min в строке $time_min = $row['min'].
Можно поставить AS `min` дважды: Код (Text): $query = mysqli_query($db, "SELECT MIN(`time`) AS `min` FROM (SELECT `time` FROM `notice` WHERE `user_id` = '72' ORDER BY `time` DESC LIMIT 5) AS `min`"); $row = mysqli_fetch_assoc($query); $time_min = $row['min']; Так работает. Но это какое-то извращение. Нет ли корректного работоспособного решения?
Код (Text): $query = mysqli_query($db, "SELECT MIN(`time`) FROM (SELECT `time` FROM `notice` WHERE `user_id` = '72' ORDER BY `time` DESC LIMIT 5) AS `min`"); $row = mysqli_fetch_assoc($query); $time_min = current($row);
Если внимательно посмотрите, то у вас в админке не `min`, а `MIN(time)`. Можно псевдоним внутреннего подзапроса назвать иначе, например `temp`. Внешний запрос использует псевдоним `temp` для ссылки на результат подзапроса.
Какая задача, такое и решение. SQL нормальный. Попробуй сформулировать свою хотелку на русском так, чтобы она была логична и понятна. А то ты начал с описания КАК ты собираешся реализовать, а не ЧТО ты хочешь сделать. --- Добавлено --- да он чемпион по невнимательности!
Как я уже писал в теме, я хотел для пользователя user_id отсортировать выборку по time по убыванию и из первых пяти строк найти минимальное значение time. Проблема решена, спасибо всем ответившим!