группа mysql по ошибке, не может ее увидеть

#mysql #sql

#mysql #sql

Вопрос:

У меня есть запрос, и я возвращаю следующую ошибку, однако я не могу найти проблему,

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘ИМЕЮЩИЙ DATE_FORMAT(NOW(), ‘%Y’) — DATE_FORMAT( candidates . DOB , ‘%Y’) — (DATE_’ в строке 14

это мой запрос,

 SELECT `candidates`.`candidate_id`, 
       `candidates`.`first_name`, 
       `candidates`.`surname`, 
       `candidates`.`DOB`, 
       `candidates`.`gender`, 
       `candidates`.`talent`, 
       `candidates`.`location`, 
       `candidates`.`availability`, 
       DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`candidates`.`DOB`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`candidates`.`DOB`, '00-%m-%d')) 
                   as `age`, 
       `candidate_assets`.`url`, 
       `candidate_assets`.`asset_size` 
FROM `candidates` 
LEFT JOIN `candidate_assets` ON `candidate_assets`.`candidates_candidate_id` = `candidates`.`candidate_id` 
WHERE `candidates`.`availability` = 'yes' 
AND candidates.talent = "presenter" 
AND candidates.gender = "male" 
HAVING DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`candidates`.`DOB`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`candidates`.`DOB`, '00-%m-%d')) <= 39
AND HAVING DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(`candidates`.`DOB`, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(`candidates`.`DOB`, '00-%m-%d')) <=29 
GROUP BY `candidates`.`candidate_id`
 

в чем проблема, я не заядлый пользователь MySQL

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

1. ПОЖАЛУЙСТА , не отправляйте запрос в одной строке подобным образом. Пробел — ваш друг.

2. @sico87 Кажется, что вы вычисляете возраст только на основе года. Вы знаете, я родился в мае, мой возраст меняется в мае, а не только с годом. Рассмотрите возможность использования DateDiff .

3. @MPelletier, возможно, вам потребуется прокрутить вправо — вычисление возраста включает логическое выражение, проверяющее, является ли текущая дата более ранней в году, чем DOB . DateDiff может возвращать значения только в днях, а не в годах.

4. @MarkBannister Тем не менее, вы можете превратить дни в годы, разделить на 365,25 или что-то в этом роде. Должен быть лучший способ вычислить чей-то возраст. В худшем случае хранимая процедура.

5. Деление на 365,25 должно было бы включать условные проверки того, является ли текущий год високосным, поскольку при таких обстоятельствах, где true, будет n 1 високосных дней через 4n лет, в то время как в 4n годах будет только n високосных дней, если не високосный год. Не говоря уже о столетнем правиле для високосных лет… В принципе, было бы намного лучше, если бы MySQL включил аргумент interval в DateDiff .

Ответ №1:

Три вещи, которые я вижу сразу:

1 — HAVING должно выполняться только один раз в запросе, а не дважды.
2 — HAVING всегда должно быть после GROUP BY
3 — HAVING применяется только к АГРЕГИРОВАННЫМ ФУНКЦИЯМ, а не к чему-то вроде сравнения дат. Если вы хотите сравнить даты, вы должны использовать WHERE предложение.

Может быть больше, но ваш запрос чрезвычайно трудно прочитать в текущем «формате». Если вам нужна дополнительная помощь, пожалуйста, приложите хотя БЫ НЕКОТОРЫЕ усилия, чтобы сделать ваш вопрос читаемым.

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

1. Я подумал, что вы могли бы использовать HAVING при сравнении поля, которое было создано в запросе, т.е. Возраст

2. @sico87 — HAVING используется для агрегатных функций в стандартном SQL. Более поздние версии MySQL позволяют использовать псевдонимные поля из запроса.

Ответ №2:

Вам нужно использовать HAVING ключевое слово только один раз. Уберите вторую после AND .

Ответ №3:

Проверьте свои значения less than < как раньше from в вашем age столбце, так и внутри having . У вас больше, чем должно быть. Неверный синтаксис.