#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
. У вас больше, чем должно быть. Неверный синтаксис.