MySQL продолжает повторно использовать результат SQL-запроса

#mysql #sql #select

#mysql #sql #выберите

Вопрос:

Итак, на самом деле два вопроса:

 SELECT CurrencyRateID, Rate, Markup
FROM currency_rate 
WHERE CurrencyID = (SELECT CurrencyID FROM currency WHERE BaseCurr = 1) **A** AND
DateTime = (SELECT MAX(DateTime) 
            FROM currency_rate 
            WHERE CurrencyID = **B**)
 
  1. Почему этот запрос выдает мне
    код ошибки: 1054. Неизвестный столбец ‘CurrercyID’ в ‘списке полей’
  2. Как я могу использовать результат первого оператора SELECT A в B

Комментарии:

1. Есть ли в таблице currency_rate CurrencyID столбец?

2. Вы скопировали / вставили это сообщение об ошибке? Если это так, вы где-то неправильно написали столбец, поскольку ошибка вызывает его CurrercyID . Обратите внимание на ‘r’, где ‘n’ должно быть

3. @Jonny: используйте псевдонимы таблиц, а затем перед каждым идентификатором валюты укажите псевдоним, чтобы явно определить, из какой таблицы

4. да, я этого не заметил, но дело в том, что я скопировал запрос, который, похоже, в порядке

Ответ №1:

Надеюсь, в вашей currency_rate таблице есть столбец с уникальным идентификатором.

Если это произойдет, вы можете объединить запросы A и B в один запрос в предложении WHERE …

 SELECT
  CurrencyRateID, Rate, Markup
FROM
  currency_rate 
WHERE
  uniqueID = (
              SELECT uniqueID
              FROM   currency_rate
              WHERE  CurrencyID = (SELECT CurrencyID FROM currency WHERE BaseCurr = 1)
              ORDER BY DateTime DESC LIMIT 1
             )
 

Если нет, вам, возможно, придется просто повторить…

 SELECT CurrencyRateID, Rate, Markup
FROM currency_rate 
WHERE CurrencyID = (SELECT CurrencyID FROM currency WHERE BaseCurr = 1)
AND DateTime = (SELECT MAX(DateTime) 
            FROM currency_rate 
            WHERE CurrencyID = (SELECT CurrencyID FROM currency WHERE BaseCurr = 1))
 

Примечание: Даже если код повторяется, вполне вероятно, что MySQL заметит повторение и выполнит запрос только один раз.

Редактировать:

Я только что заметил, что вы могли бы упростить первый вариант, просто используя вложенный запрос…

   SELECT CurrencyRateID, Rate, Markup
  FROM   currency_rate
  WHERE  CurrencyID = (SELECT CurrencyID FROM currency WHERE BaseCurr = 1)
  ORDER BY DateTime DESC LIMIT 1
 

Ответ №2:

Проверьте, существует ли столбец CurrencyID в таблице валют, и измените запрос таким образом, чтобы вы могли использовать оператор A в предложении where.

 SELECT CurrencyRateID, Rate, Markup
FROM currency_rate cr inner join 
   (SELECT CurrencyID FROM currency WHERE BaseCurr = 1) **A**
   ON cr.CurrencyID = a.CurrencyID 
WHERE cr.DateTime = (SELECT MAX(DateTime) 
            FROM currency_rate 
            WHERE CurrencyID = A.CurrencyID)