如何在 PHP 中创建子查询?

Posted

技术标签:

【中文标题】如何在 PHP 中创建子查询?【英文标题】:How would I create a sub query in PHP? 【发布时间】:2015-10-26 17:10:36 【问题描述】:

所以我正在研究现有系统,并试图弄清楚他们是如何设置 mysql 的。他们有这样的查询设置

    $this->db->select('nID, nAID');
    $this->db->where('bValid', 1);
    $this->db->where('nID', (int)$nID);
    $this->db->from('event');
    $this->db->group_by('nID, nAID');

    $query = $this->db->get();

这个查询很好用,但是我需要设置一个子查询。我已经用 SQL 编写了查询并对其进行了测试以确认它可以工作,但我无法弄清楚如何翻译它。基本上,我需要的不是从“事件”表中获取,而是从我之前所做的子选择中获取。我想象的会是怎样。

    $this->db->select('nID, nAID');
    $this->db->where('bValid', 1);
    $this->db->where('nID', (int)$nID);
    $this->db->from(
         $this->db->select('something, somethingelse');
         $this->db->where('something', 1);
         $this->db->get();  
    );
    $this->db->group_by('nID, nAID');

    $query = $this->db->get();

【问题讨论】:

github.com/bcit-ci/CodeIgniter/wiki/Subqueries 【参考方案1】:

第1步:将此代码放入DB_active_rec.php

 // --------------------------------------------------------------------
    /**
    * Get SELECT query string
    *
    * Compiles a SELECT query string and returns the sql.
    *
    * @param    string    the table name to select from (optional)
    * @param    bool    TRUE: resets QB values; FALSE: leave QB vaules alone
    * @return    string
    */
   public function get_compiled_select($table = '', $reset = TRUE)
   
       if ($table !== '')
       
           $this->_track_aliases($table);
           $this->from($table);
       

       $select = $this->_compile_select();

       if ($reset === TRUE)
       
           $this->_reset_select();
       

       return $select;
   

第 2 步:试试这个

//Subquery
$this->db->select('something, somethingelse');
$this->db->where('something', 1);
$this->db->from('first_table');
$sub_query = $this->db->get_compiled_select();


$this->db->select('nID, nAID');
$this->db->where('bValid', 1);
$this->db->where('nID', (int)$nID);
$this->db->from("($sub_query) as tbl1");
$this->db->group_by('nID, nAID');

$query = $this->db->get();

告诉我它是否有效。

【讨论】:

DB_active_rec 在哪里?我找不到它。 在您的 CI 框架中..从 system 文件夹开始:system\database\DB_active_rec.php【参考方案2】:
            $this->db->select('nID, nAID');
            $this->db->where('bValid', 1);
            $this->db->where('nID', (int)$nID);
            $this->db->from('event');
            $this->db->group_by('nID, nAID');

翻译成 select nID, nAID from event where bValid=1 and nId='$nID' group by nID

你的子查询

            $this->db->select('nID, nAID');
            $this->db->where('bValid', 1);
            $this->db->where('nID', (int)$nID);
            $this->db->from(
            $this->db->select('something, somethingelse');
            $this->db->where('something', 1);
            $this->db->get();  
            );
            $this->db->group_by('nID, nAID');

大致翻译成

            select nID, nAID select something,somethingelse where something=1 event where bValid=1 and nId='$nID' group by nID

我建议对循环中的每条记录运行子查询

【讨论】:

以上是关于如何在 PHP 中创建子查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Querydsl 中创建子查询

如何在视图 SQL 的全选 (*) 中创建子查询?

在主窗体中创建子窗体

使用 peewee 创建子查询,在子查询结果上使用 `.select`

JOOQ:使用 WITH 子句创建子查询(使用纯 SQL)

HSQLDB 触发器语法 - 不可能在触发器内进行子查询吗?