#mysql
#mysql
Вопрос:
Итак, у меня есть таблица в моей базе данных (которую я назову Test). Таблица называется Items и имеет столбец int с именем ItemId и столбец decimal(8, 2) с именем currently . Они представляют уникальный идентификатор для элемента и текущую цену предложения для элемента соответственно. Текущий столбец может быть НУЛЕВЫМ, потому что, возможно, еще не было ставки на товар.
Моя цель — получить ItemId элемента с самой высокой текущей ставкой, которая имеет хотя бы одну ставку. У меня есть запрос mysql, который выглядит следующим образом:
select itemID
from (select itemID from Items where numBids > 0) as b
where currently = (select max(currently) from b);
Когда я выполняю это в mysql, я получаю сообщение об ошибке, в котором говорится:
ERROR 1146 (42S02): Table 'Test.b' doesn't exist
Кто-нибудь может объяснить, что здесь происходит? Я давно не использовал mysql, поэтому я устал. Должен ли я выполнять объединение элементов с самим собой, чтобы выполнить что-то подобное? Любая помощь будет оценена.
Ответ №1:
Псевдоним «b» не просматривается последним подзапросом. Вместо того, чтобы использовать этот сложный запрос, используйте
SELECT itemID
FROM Items
WHERE numBids > 0
ORDER BY currently DESC
LIMIT 1
Для обработки ситуации, когда несколько элементов имеют самую высокую текущую ставку:
SELECT itemID
FROM Items
WHERE numBids > 0
AND currently =
( SELECT MAX(currently)
FROM Items
WHERE numBids > 0
)
Комментарии:
1. Ах, это намного проще! Кажется, я никогда не могу думать о них такими чистыми способами. Большое спасибо.
2. Однако у меня есть вопрос. Это не обрабатывает ситуацию, когда несколько элементов имеют самую высокую текущую ставку. Есть ли простой обходной путь для получения всех товаров с самой высокой текущей ставкой?
Ответ №2:
Проблема в том, что вы не можете использовать b
внутри select
where
clausole .
Комментарии:
1. Ах, спасибо. Требует ли это полного переосмысления структуры моего запроса?
2. Попробуйте выбрать b.ItemId из элементов b, где b.numBids > 0 и b.currently = (выберите max(a.currently) из элементов a, где a.ItemId = b.ItemId и a.numBids> 0);
3. carpii: Спасибо, но выполнение этого запроса занимает слишком много времени (по крайней мере, на моей машине).