2014-11-13 2 views
1

Я не знаю, что здесь не так. Я выполняю запрос с множественным объединением из 3 таблиц, запрос ниже работает отлично ... Предоставляя мне данные о сотрудниках, его возрасте, если он требует сертификат и дает мне информацию о дате истечения срока действия сертификатов, также помещается " -»в следующем поле, если сертификат не требуется - и, как я сказал, это работает как шарм ...Внутренний запрос на 3 таблицы

SELECT 
    `employee`.*, 
    date_format(now(), '%Y') - date_format(`empl_dob`, '%Y') - 
     (date_format(now(), '00-%m-%d') < date_format(`empl_dob`, '00-%m-%d')) AS age, 
    `certs`.`cert_medical_restrict`, 
    IF(`jobtitle`.`jt_medical`='n/a', `jobtitle`.`jt_medical`, 
     IF(`certs`.`cert_medical` = 0, 'No Cert', 
      IF((DATEDIFF((DATE_ADD(`certs`.`cert_medical`, INTERVAL 365 DAY)),CURDATE())) < 1, 'X', 
       IF((DATEDIFF((DATE_ADD(`certs`.`cert_medical`, INTERVAL 365 DAY)),CURDATE())) < 30, 'ES', 'ok'))) 
     ) AS medical,  
    IF(`jobtitle`.`jt_medical`='n/a', '-', 
     IF(`certs`.`cert_medical` = 0, '-', (DATEDIFF((DATE_ADD(`certs`.`cert_medical`, INTERVAL 365 DAY)),CURDATE())))) AS medicalx 
    FROM `employee` 
    JOIN `jobtitle` 
    ON `employee`.`jobtitle_id` = `jobtitle`.`jobtitle_id` 
    JOIN `certs` 
    ON `certs`.`empl_idno` = `employee`.`empl_idno` 
    WHERE `employee`.`empl_no` = '10517602' 

... Но для моего следующего запроса, мне нужно, чтобы отобразить текущую дату истечения срока свидетельства, запросы выглядят почти так же, но без дополнительных IF заявления ...

SELECT 
    `employee`.*, 
    date_format(now(), '%Y') - date_format(`empl_dob`, '%Y') - 
     (date_format(now(), '00-%m-%d') < date_format(`empl_dob`, '00-%m-%d')) AS age, 
    `certs`.`cert_medical_restrict`, 
    IF(`jobtitle`.`jt_medical`='n/a', `jobtitle`.`jt_medical`, 
     IF(`certs`.`cert_medical` = 0, 'No Cert', (DATE_ADD(`certs`.`cert_medical`, INTERVAL 365 DAY)))) AS medical,  
    IF(`jobtitle`.`jt_medical`='n/a', '-', 
     IF(`certs`.`cert_medical` = 0, '-', (DATEDIFF((DATE_ADD(`certs`.`cert_medical`, INTERVAL 365 DAY)),CURDATE())))) AS medicalx 
    FROM `employee` 
    JOIN `jobtitle` 
    ON `employee`.`jobtitle_id` = `jobtitle`.`jobtitle_id` 
    JOIN `certs` 
    ON `certs`.`empl_idno` = `employee`.`empl_idno` 
    WHERE `employee`.`empl_no` = '10517602' 

Теперь я получаю эту ошибку «Illegal смесь collatio ns (latin1_swedish_ci, IMPLICIT) и (utf8mb4_general_ci, COERCIBLE) для операции «if» « Я не могу опустить голову, я проверил, отличаются ли три таблицы друг от друга, но все они установлены на« latin_swedish_ci »

Что я здесь делаю неправильно? Любая помощь была бы оценена - thanx

+0

Пожалуйста, дайте 'table structure' –

+0

' IMPLICIT' о строках inSQL, а не о некоторых полях базы данных. Использование 'utf8' везде должно исправить все эти проблемы. –

+0

прочитайте также статью [this] (http://airbladesoftware.com/notes/fixing-mysql-illegal-mix-of-collations/). –

ответ

0

IMPLICIT - о строках inSQL, а не о некоторых полях базы данных.
Использования utf8 во всем мире должен исправить все эти вопросы ..

Читать this статьи об этой проблеме.

Смежные вопросы