mysql: псевдоним таблицы не существует

#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: Спасибо, но выполнение этого запроса занимает слишком много времени (по крайней мере, на моей машине).