Столбец MySQL не найден - PullRequest
       10

Столбец MySQL не найден

2 голосов
/ 06 апреля 2010

SQL-запрос без оператора where работает отлично и дает хорошие результаты, но когда я включаю условие WHERE, он показывает неизвестный столбец «date1» в «where clause». В чем проблема?

SELECT
  IF( e.weekly,
      DATE_ADD(DATE(e.time),
      INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
   DATE(e.time)) AS `e.date1`,
   `v`.`lat`,
   `v`.`lng` 
FROM `events` AS `e`
INNER JOIN `venues` AS `v` ON e.venue_id = v.id
WHERE e.date1 > '2010-09-01'

Ответы [ 4 ]

7 голосов
/ 06 апреля 2010

Вы не можете использовать псевдоним столбца с <tablename>.<name>. Вместо AS e.date1 вам действительно нужно использовать AS date1. (Если вы опустите галочки для создания псевдонима, вы получите ошибку синтаксиса SQL.)

Но это только одна причина. Другая причина в том, что псевдонимы нельзя использовать в предложениях WHERE.

Из документации :

Псевдоним может использоваться в списке выбора запроса, чтобы присвоить столбцу другое имя. Вы можете использовать псевдоним в предложениях GROUP BY, ORDER BY или HAVING для ссылки на столбец

и

Стандартный SQL запрещает ссылки на псевдонимы столбцов в предложении WHERE. Это ограничение наложено потому, что при оценке предложения WHERE значение столбца может еще не быть определено.

Но вы можете использовать псевдонимы в предложении HAVING:

SELECT
  IF( e.weekly,
    DATE_ADD(DATE(e.time),
    INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
    DATE(e.time)) AS `date1`,
  `v`.`lat`,
  `v`.`lng` 
FROM `events` AS `e`
INNER JOIN `venues` AS `v` ON e.venue_id = v.id
HAVING date1 > '2010-09-01'

или вы повторяете весь оператор IF в предложении where.

0 голосов
/ 06 апреля 2010

Хотите верьте, хотите нет, но вам нужно добавить тот же оператор IF в предложении where.

SELECT
  IF( e.weekly,
      DATE_ADD(DATE(e.time),
      INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
   DATE(e.time)) AS `e.date1`,
   `v`.`lat`,
   `v`.`lng` 
FROM `events` AS `e`
INNER JOIN `venues` AS `v` ON e.venue_id = v.id
WHERE IF( e.weekly,
      DATE_ADD(DATE(e.time),
      INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
   DATE(e.time)) > '2010-09-01'
0 голосов
/ 06 апреля 2010

edit: сообщение об ошибке: »Неизвестный столбец« date1 »в« where »«

причина этого в том, что оператор op псевдонимом является псевдонимом 'e.date1'. в своем предложении where он пишет e.date1 без каких-либо обратных галочек. e.date1 будет искать столбец date1 в таблице e и отличается от псевдонима e.date1 (с обратными галочками)


вы создаете псевдоним для подзапроса с именем "e.date1", а затем ссылаетесь на столбец "date1" в таблице "e" - которого не существует.

Вы должны либо ввести псевдоним "date1", а затем использовать WHERE date1, либо написать где WHERE ``e.date1`` (испорчено уценкой ...

полный код:

SELECT
  IF( e.weekly,
      DATE_ADD(DATE(e.time),
      INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
   DATE(e.time)) AS `e.date1`,
   `v`.`lat`,
   `v`.`lng` 
FROM `events` AS `e`
INNER JOIN `venues` AS `v` ON e.venue_id = v.id
WHERE `e.date1` > '2010-09-01'

или

SELECT
  IF( e.weekly,
      DATE_ADD(DATE(e.time),
      INTERVAL CEIL(DATEDIFF('2010-04-08', e.time)/7) WEEK ),
   DATE(e.time)) AS e.date1,
   `v`.`lat`,
   `v`.`lng` 
FROM `events` AS `e`
INNER JOIN `venues` AS `v` ON e.venue_id = v.id
WHERE e.date1 > '2010-09-01'
0 голосов
/ 06 апреля 2010

Вопрос отладки для вас, что произойдет, если у вас есть простой вариант Выбрать, где вы выбираете e.date1 из 'events' как 'e'? Обычно я возвращаюсь к этому типу запроса, если по какой-то причине моя синтаксическая ошибка чем-то скрыта.

Кстати, я заметил, что у вас есть «e.date1», а затем вы используете e.date1, то есть без одинарных кавычек. Казалось бы, это не работает, хотя я не парень MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...