【问题标题】:SET variable on codeigniter SQL在 codeigniter SQL 上设置变量
【发布时间】:2013-02-22 07:30:35
【问题描述】:

我试过这段代码:

SET @num := 0, @type := NULL;
SELECT categories_name, products_name, products_url, categories_id, 
       @num := IF( @type = categories_name, @num +1, 1 ) AS row_number,
       @type := categories_name AS dummy
  FROM (
        SELECT categories_name, products_name, products_url, ptc.categories_id
          FROM toc_products_description pd
         INNER JOIN toc_products_to_categories ptc ON pd.products_id = ptc.products_id
         INNER JOIN toc_categories_description cd ON cd.categories_id = ptc.categories_id
               AND pd.language_id =1
               AND cd.language_id =1
        ) AS x
 GROUP BY x.categories_name, x.products_name, x.products_url, x.categories_id
HAVING row_number <=2

在 SQL 上(并且运行良好),现在我需要使用 query() 在 codeigniter 上实现此代码。问题是我无法插入

SET @num := 0, @type := NULL;

在 query() 上,因为我插入时它总是给出错误消息。

我已经这样做了:

$query="SELECT categories_name, products_name, products_url, categories_id, @num := IF( @type := categories_name, @num +1, TRUE) AS row_number, @type := categories_name AS dummy
                FROM (
                SELECT categories_name, products_name, products_url, ptc.categories_id
                FROM toc_products_description pd
                INNER JOIN toc_products_to_categories ptc ON pd.products_id = ptc.products_id
                INNER JOIN toc_categories_description cd ON cd.categories_id = ptc.categories_id
                AND pd.language_id =1
                AND cd.language_id =1
                ) AS x
                GROUP BY x.categories_name, x.products_name, x.products_url, x.categories_id
                HAVING row_number <=5";        
        $result = $this->db->query($query);

我不能在 SELECT 语法之前写任何东西,因为当我尝试它时它会返回错误消息。

【问题讨论】:

    标签: sql codeigniter codeigniter-2


    【解决方案1】:

    您必须为此运行两个单独的查询

    $query  =   "SET @num := 0, @type := NULL";
    $this->db->query($query);
    $new_query  =   "
                    SELECT categories_name, products_name, products_url, categories_id, 
                           @num := IF( @type = categories_name, @num +1, 1 ) AS row_number,
                           @type := categories_name AS dummy
                      FROM (
                            SELECT categories_name, products_name, products_url, ptc.categories_id
                              FROM toc_products_description pd
                             INNER JOIN toc_products_to_categories ptc ON pd.products_id = ptc.products_id
                             INNER JOIN toc_categories_description cd ON cd.categories_id = ptc.categories_id
                                   AND pd.language_id =1
                                   AND cd.language_id =1
                            ) AS x
                     GROUP BY x.categories_name, x.products_name, x.products_url, x.categories_id
                    HAVING row_number <=2";
    $this->db->query($new_query);               
    

    【讨论】:

    • 非常感谢您,先生!我以前试过这个,忘记添加第一个查询()。现在它运行良好!谢谢。
    【解决方案2】:

    使用您的 SQL 创建一个存储过程并从 query() 调用该存储过程

    【讨论】:

    • 我不能在 SELECT 之前写任何语法
    • SET ... 和您的整个 select 语句都将在同一个存储过程中,因此您的 $query 将只是 CALL YourSPName (mysql) 或 EXEC YourSPName (sql server)
    【解决方案3】:

    写入模型

    public function select_datos($param1) {
        if ($param1 == 'planilla') {
            $query1 = "SET @numero := 0, @type := NULL";
            $this->db->query($query1);
            $this->db->select('*');
            $this->db->select("@numero:=@numero+1 AS 'posicion'");
            $this->db->from($param1);
            $query = $this->db->get();
            $row['planilla'] = $query->row();
        } else {
            $query = '1'; //    Error
        }
        return $query->result();
    }
    

    【讨论】:

    • edit 解释为什么这段代码回答了这个问题。
    猜你喜欢
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多