【问题标题】:Codeigniter, Join and Case When Query查询时的 Codeigniter、Join 和 Case
【发布时间】:2013-05-23 04:25:21
【问题描述】:

正在尝试执行此查询。

$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

谁能告诉我的查询出了什么问题以及如何解决?

++++++++++++++++++++++++++++++++++++++++++++++++++ + 更新:

删除了单引号

$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

【问题讨论】:

  • 为什么使用*,它将检索6个表的所有列。指定要检索的列
  • 将所有表或列名中的'(单引号)更改为`(在~下签名)

标签: php mysql database codeigniter


【解决方案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 时。列名\中排除点.

使用`tablename`.`column_name`

【讨论】:

    【解决方案2】:

    在您的查询中,您在表名和列名中使用'' 单个配额,将其视为字符串,因此将单个配额替换为 `` 标签。

    这里是替换代码:

    $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;";
    

    【讨论】:

    • 我更新了我的问题,在你的情况下,我收到了我在更新中添加的第二个错误。?
    • @SyedHaiderHassan 再次检查您的查询,然后执行它。也许你已经留下了任何空间,或者你需要添加列名为 isDefault 的表名。
    【解决方案3】:

    只需删除表格名称周围的引号即可。

    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 周围添加括号;)

    【讨论】:

    • CI 不支持的情况。
    【解决方案4】:

    去掉所有的单引号:

    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
    )
    

    【讨论】:

    • 更新了我的问题,我删除了所有的单引号,但仍然出现错误。
    【解决方案5】:

    您好,只需在 where 子句中添加此条件
    CORE QUERY

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

    CI 查询

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

    【讨论】:

      【解决方案6】:

      这是我为解决系统中需要案例的问题所做的一个示例,codeigniter 在查询中插入了 ` 并返回了错误。我的解决方案是将 括号 => () 放在案例中。

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

      【讨论】:

        猜你喜欢
        • 2017-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 2015-08-28
        相关资源
        最近更新 更多