2013-05-28 5 views
0

Попытка выполнить этот запрос.Codeigniter, Join и Case When Query

$sql ="SELECT '*' FROM 
      'osp_job_details' 
       LEFT JOIN 
      'osp_job_status_track' ON 'osp_job_status_track'.'JobID' = 'osp_job_details'.'JobID' 
       LEFT JOIN 
      'osp_job_status' ON 'osp_job_status'.'StatusID' = 'osp_job_status_track'.'StatusID' 
       LEFT JOIN 
      'osp_job_sub_status' ON 'osp_job_sub_status'.'SubStatusID' = 'osp_job_status_track'.'SubStatusID' 
       LEFT JOIN 
      'hr_employee_details' ON 'hr_employee_details'.'EmployeeID' = 'osp_job_details'.'AssignToEmployeeID' 
       LEFT JOIN 
      'osp_job_type' ON 'osp_job_type'.'JobTypeID' = 'osp_job_details'.'JobtypeID' 
      WHERE 'isDefault' = 0 AND 

      CASE WHEN 'osp_job_status'.'StatusID' = '2' 
      THEN 'osp_job_sub_status'.'CurrentStatus' = '3' 
      ELSE 'osp_job_status'.'StatusID' >= '2' 
       END;"; 

     $query = $this->db->query($sql); 
     return $query->result(); 

Но я получаю эту ошибку ниже при выполнении вышеуказанного запроса.

Error Number: 1064 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''osp_job_details' LEFT JOIN 'osp_job_status_track'' at line 2 

SELECT '*' FROM 'osp_job_details' LEFT JOIN 'osp_job_status_track' ON 'osp_job_status_track'.'JobID' = 'osp_job_details'.'JobID' LEFT JOIN 'osp_job_status' ON 'osp_job_status'.'StatusID' = 'osp_job_status_track'.'StatusID' LEFT JOIN 'osp_job_sub_status' ON 'osp_job_sub_status'.'SubStatusID' = 'osp_job_status_track'.'SubStatusID' LEFT JOIN 'hr_employee_details' ON 'hr_employee_details'.'EmployeeID' = 'osp_job_details'.'AssignToEmployeeID' LEFT JOIN 'osp_job_type' ON 'osp_job_type'.'JobTypeID' = 'osp_job_details'.'JobtypeID' WHERE 'isDefault' = 0 AND CASE WHEN 'osp_job_status'.'StatusID' = '2' THEN 'osp_job_sub_status'.'CurrentStatus' = '3' ELSE 'osp_job_status'.'StatusID' >= '2' END; 

Filename: C:\xampp\htdocs\projects\zorkif_new\system\database\DB_driver.php 

Line Number: 330 

Может ли кто-нибудь сказать, что не так в моем запросе и как его решить?

++++++++++++++++++++++++++++++++++++++++++++++ ++ Update:

Убрана одиночные кавычки

$sql ="SELECT * FROM 
    osp_job_details 
     LEFT JOIN 
    osp_job_status_track ON osp_job_status_track.JobID = osp_job_details.JobID 
     LEFT JOIN 
    osp_job_status ON osp_job_status.StatusID = osp_job_status_track.StatusID 
     LEFT JOIN 
    osp_job_sub_status ON osp_job_sub_status.SubStatusID = osp_job_status_track.SubStatusID 
     LEFT JOIN 
    hr_employee_details ON hr_employee_details.EmployeeID = osp_job_details.AssignToEmployeeID 
     LEFT JOIN 
    osp_job_type ON osp_job_type.JobTypeID = osp_job_details.JobtypeID 
    WHERE isDefault = 0 AND 

    CASE WHEN osp_job_status.StatusID = 2 
    THEN osp_job_sub_status.CurrentStatus = 3 
    ELSE osp_job_status.StatusID >= 2 
     END;"; 

Но получить эту ошибку ниже сейчас ..

Error Number: 1064 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'isDefault` = 1 AND CASE WHEN `osp_job_status`.`StatusID` = 2 THEN `osp_job' at line 8 

SELECT `osp_job_details`.*, `osp_job_type`.`JobTypeName`, `status`, `Substatus`, `osp_job_status`.`StatusID`, `osp_job_sub_status`.`SubStatusID`, `FirstName`, `MiddleNames`, `LastName`, `hr_employee_details`.`EmployeeID`, `osp_job_status_track`.`StatusTrackID` FROM (`osp_job_details`) LEFT JOIN `osp_job_status_track` ON `osp_job_status_track`.`JobID` = `osp_job_details`.`JobID` LEFT JOIN `osp_job_status` ON `osp_job_status`.`StatusID` = `osp_job_status_track`.`StatusID` LEFT JOIN `osp_job_sub_status` ON `osp_job_sub_status`.`SubStatusID` = `osp_job_status_track`.`SubStatusID` LEFT JOIN `hr_employee_details` ON `hr_employee_details`.`EmployeeID` = `osp_job_details`.`AssignToEmployeeID` LEFT JOIN `osp_job_type` ON `osp_job_type`.`JobTypeID` = `osp_job_details`.`JobtypeID` WHERE ` ` isDefault` = 1 AND CASE WHEN `osp_job_status`.`StatusID` = 2 THEN `osp_job_sub_status`.`CurrentStatus` = 3 ELSE `osp_job_status`.`StatusID` >= 2 END ; 

Filename: C:\xampp\htdocs\projects\zorkif_new\system\database\DB_driver.php 

Line Number: 330 
+0

почему использование '*', он извлекает 6 таблицы все столбцы. укажите столбцы, которые вы хотите получить – diEcho

+0

изменить '' '(одинарная кавычка) на' \ '' (под знаком '~') из всего имени таблицы или столбца – diEcho

ответ

1

использовать псевдоним для упрощения

$sql ="SELECT [specific column names ] FROM `osp_job_details` jd 
    LEFT JOIN 
      `osp_job_status_track` jst ON (`jst`.`JobID` = `jd`.`JobID`) 
    LEFT JOIN 
      `osp_job_status` js ON (`js`.`StatusID` = `jst`.`StatusID`) 
    LEFT JOIN 
      `osp_job_sub_status` jss ON (`jss`.`SubStatusID` = `jst`.`SubStatusID`) 
    LEFT JOIN 
      `hr_employee_details` hed ON (`hed`.`EmployeeID` = `jd`.`AssignToEmployeeID`) 
    LEFT JOIN 
      `osp_job_type` jt ON (`jt`.`JobTypeID` = `jd`.`JobtypeID`) 

    WHERE `isDefault` = '0' 
    AND CASE 
       WHEN `js`.`StatusID` = '2' THEN `jss`.`CurrentStatus` = '3' 
       ELSE `jd`.`StatusID` >= '2' 
      END "; 
    $this->db->query($qry); 

ПРИМЕЧАНИЕ: обруча имя столбца и таблицы имя с ` не с ', а также при обращении имя_таблицы , название колонки исключить точку . от \

использование `tablename`.`column_name `

1

Просто удалите кавычки вокруг имени таблицы.

SELECT * 
FROM osp_job_details 
(...) 

И для чего это стоит, вы должны попробовать использовать activerecord для CodeIgniter. Вам не придется беспокоиться с SQL:

$this->db 
    ->from('osp_job_details') 
    ->join('osp_job_status_track', 'osp_job_status_track.JobID = osp_job_details.JobID', 'left') 
    ->join('osp_job_status', 'osp_job_status.StatusID = osp_job_status_track.StatusID', 'left') 
    ->join('osp_job_sub_status', 'osp_job_sub_status.SubStatusID = osp_job_status_track.SubStatusID', 'left') 
    ->join('hr_employee_details', 'hr_employee_details.EmployeeID = osp_job_details.AssignToEmployeeID', 'left') 
    ->join('osp_job_type', 'osp_job_type.JobTypeID = osp_job_details.JobtypeID', 'left') 
    ->where('isDefault', 0) 
    ->where("osp_job_status.StatusID = '2' AND osp_job_sub_status.CurrentStatus = '3' OR osp_job_status.StatusID >= '2'") 
    ->result(); 

И если он не работает, добавьте скобки вокруг CASE WHEN;)

+0

Случай Когда не поддерживается CI. –

+0

Корпус Если это не требуется. –

1

удалить все одинарные кавычки:

SELECT * FROM 
      osp_job_details 
       LEFT JOIN 
      osp_job_status_track ON osp_job_status_track.JobID = osp_job_details.JobID 
       LEFT JOIN 
      osp_job_status ON osp_job_status.StatusID = osp_job_status_track.StatusID 
       LEFT JOIN 
      osp_job_sub_status ON osp_job_sub_status.SubStatusID = osp_job_status_track.SubStatusID 
       LEFT JOIN 
      hr_employee_details ON hr_employee_details.EmployeeID = osp_job_details.AssignToEmployeeID 
       LEFT JOIN 
      osp_job_type ON osp_job_type.JobTypeID = osp_job_details.JobtypeID 
      WHERE isDefault = 0 AND 

      CASE WHEN osp_job_status.StatusID = 2 
      THEN osp_job_sub_status.CurrentStatus = 3 
      ELSE osp_job_status.StatusID >= 2 
       END; 

Если вы хотите избежать имен таблиц и полей, которые вы можете использовать как «` »

ОБНОВЛЕНИЕ: заменить корпус:

CASE WHEN osp_job_status.StatusID = 2 
THEN osp_job_sub_status.CurrentStatus = 3 
ELSE osp_job_status.StatusID >= 2 
    END; 

с:

(
    (
     osp_job_status.StatusID = 2 
     AND 
     osp_job_sub_status.CurrentStatus = 3 
    ) 
    OR 
    osp_job_status.StatusID >= 2 
) 
+0

Обновленный мой вопрос, я удалил все одинарные кавычки, но все еще получаю ошибку. –

+0

Я тоже обновил свой ответ – Stephan

1

В вашем запросе вы используете '' единственной квоты в имени таблицы и имени столбца, по которому она трактуются как строка так вместо одного квоты с `` тегом.

Здесь заменяется код:

$sql ="SELECT * FROM 
      `osp_job_details` 
       LEFT JOIN 
      `osp_job_status_track` ON `osp_job_status_track`.`JobID` = `osp_job_details`.`JobID` 
       LEFT JOIN 
      `osp_job_status` ON `osp_job_status`.`StatusID` = `osp_job_status_track`.`StatusID` 
       LEFT JOIN 
      `osp_job_sub_status` ON `osp_job_sub_status`.`SubStatusID` = `osp_job_status_track`.`SubStatusID` 
       LEFT JOIN 
      `hr_employee_details` ON `hr_employee_details`.`EmployeeID` = `osp_job_details`.`AssignToEmployeeID` 
       LEFT JOIN 
      `osp_job_type` ON `osp_job_type`.`JobTypeID` = `osp_job_details`.`JobtypeID` 
      WHERE `isDefault` = 0 AND 

      CASE WHEN `osp_job_status`.`StatusID` = '2' 
      THEN `osp_job_sub_status`.`CurrentStatus` = '3' 
      ELSE `osp_job_status`.`StatusID` >= '2' 
       END;"; 
+0

Я обновил свой вопрос, в вашем случае я получаю вторую ошибку, которую я установил в своем обновлении.? –

+0

@SyedHaiderHassan снова проверит ваш запрос, а затем выполнит его. возможно, вы оставили какое-либо пространство или вам нужно добавить имя таблицы с именем столбца isDefault. –

0

Привет Просто Добавить это условие в вашем где п
CORE QUERY

(CASE 
     WHEN 
      tbl_account.account_type = 4 
     THEN 
      1 
    ELSE 
    `tbl_acc_company`.`acc_comp_status` = 'ACTIVE' 
    END 
) 

CI QUERY

$this->db->where("(CASE WHEN tbl_account.account_type = 4 THEN 1 ELSE tbl_acc_company.acc_comp_status = 'ACTIVE' END)"); 
0

это пример того, что я сделал решить проблему в моей системе, которая нуждалась в случае, и вставил код ` в запросе и возвратил ошибку. Моим решением было положить круглые скобки =>() в кейсе.

$this->db->select("(case when c.my_column THEN c.my_column ELSE c.other_column END as my_column_name)")