【问题标题】:change mysql where_in query to codeigniters active record将 mysql where_in 查询更改为 codeigniters 活动记录
【发布时间】:2011-01-04 22:25:43
【问题描述】:

是否可以纠正这个查询

`$sql = '
    SELECT *
    FROM employers
    LEFT JOIN jobwall ON jobwall.employers_employer_id = employers.employer_id
    WHERE employers.employer_id
    IN (SELECT employers_employer_id FROM jobwall)
';

$this->db->query($sql);`

作为 codeigniter 中的活动记录

【问题讨论】:

  • 不确定我是否遵循LEFT JOIN to jobwall 和WHERE...IN 子句的目的。如果employees.employer_id 必须是IN 那个子查询,那么你不能简单地使用INNER JOIN 代替吗?
  • 你能告诉我你的意思吗?但是我想要实现的是显示公司名称,然后显示与公司相关的工作列表,进行内部连接显示公司拥有的每项工作的公司名称
  • 您的子查询选择用于连接条件的同一列employers_employer_id。如果雇主.employer_id 必须是该子查询的IN,那么您实际上已将LEFT JOIN 转换为INNER JOIN。所以,我认为查询可以简化为:SELECT * FROM employers INNER JOIN jobwall ON jobwall.employers_employer_id = employers.employer_id
  • 这个问题是我可能在 jobwall 表中有多个来自雇主的条目,这意味着它会多次显示雇主,我只想显示雇主一次然后列出工作雇主
  • @sea_1987:我已经给出了where...in..的活动记录查询。

标签: php mysql codeigniter activerecord


【解决方案1】:

我同意 Joe Stefanelli 的观点,LEFT JOIN 和 WHERE IN 子查询对于普通连接是不必要的。以下应该做你想做的事:

$this->db->join('jobwall'
    , 'jobwall.employers_employer_id = employers.employer_id');
$this->db->get('employers');

只有当您想获得所有雇主(无论他们是否在 jobwall 表中)时,您才会使用 LEFT JOIN。

【讨论】:

    【解决方案2】:

    我正在寻找相同的。然后得到了适当的答案。

    $this->db->select('employers_employer_id');
    $this->db->from('jobwall');
    
    $subquery = $this->db->_compile_select();
    $this->db->_reset_select();
    $subquery = str_replace("\n"," ",$subquery);
    
    $this->db->where_in('tag_page_id', $subquery, false); //false=if no escape for subquery 
    $this->db->join('jobwall', 'jobwall.employers_employer_id = employers.employer_id','left');
    $this->db->get('employers');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 2014-10-10
      • 2011-01-06
      相关资源
      最近更新 更多