【问题标题】:Codeigniter Complex MySQL QueryCodeigniter 复杂的 MySQL 查询
【发布时间】:2019-03-14 23:00:38
【问题描述】:

我有两个要查询的表,用户表和 user_job 表

users table structure

user_job table

我想要实现的是在 CodeIgniter 中编写一个 MySQL 查询,以显示用户表中的用户信息,如果用户表中的 user_status 为“活动”并且如果 user_job 表中没有 user_job_status 等于“试用期”的行或 user_job_status 等于“活动”

用简单的英语,如果用户当前不在工作中,我想显示用户信息。

我当前的 Codeigniter 型号代码是:

//get all user that are not currently assigned to a position
function get_idle_user(){
    $this->db->select('*');
    $this->db->from('users');
    $this->db->join('user_job', 'user_job.user_id_fk = users.user_id', 'INNER');
    $this->db->where('users.user_status','Active');
    $this->db->where("(user_job.user_job_status != 'Active' OR user_job.user_job_status != 'On Probation')", NULL, FALSE);
    $this->db->group_by('users.user_id');
    if($query = $this->db->get()){
        return $query;
    }else{
        return false;
    }
}

这段代码的问题是,如果有一行与用户相关并且user_job_status不满足上面的where条件,它仍然会显示用户信息。

请帮忙。

【问题讨论】:

  • 你试过$this->db->or_where("(user_job.user_job_status != 'Active' OR user_job.user_job_status != 'On Probation')", NULL, FALSE);
  • 请阅读:blog.codinghorror.com/a-visual-explanation-of-sql-joins 它总能帮助我为 JOIN 设置正确的“策略”
  • 我试过了,但结果还是一样。如上一个查询。第一个条件是用户应该处于活动状态,即 user_status = "Active" 第二个条件是用户不应持有工作,即 user_job_status 不应为“Active”或“On Probation”。我认为这里的问题在于 join 语句。例如,如果我是活跃用户并且我有一份工作,但我在数据库中也有以前的工作记录,并且状态不是“活跃”或“试用期”,它仍然会显示我的信息。

标签: php mysql codeigniter


【解决方案1】:

我相信这就是你所追求的......

$db->select('user_id_fk,COUNT(*) as `Tally`');
$db->where('user_job_status','On Probabtion');
$db->or_where('user_job_status','Active');
$db->group_by('user_id_fk');
$sub = $db->get_compiled_select('user_job_table');

$db->join("($sub) ujt",'ujt.user_id_fk = users.user_id AND Tally = 0','left');
$db->where('user_status','Active');

// View this query in full
//echo $db->get_compiled_select('users_table');

// Get the data
$data = $db->get('users_table')->result_array();

注意:

  1. 您不需要 select('*') - 不需要
  2. 你不需要 ->from() - 它可以在 get() 元素中使用

我已留在get_compiled_select 中,您可以通过它查看完整的查询并了解它在做什么。如果取消注释 echo 行,则应将 $data 行注释掉。

此查询的作用是从 job_table 中获取所有状态不为 Active 或 On Probation 的用户以及用户 ID 列表。这样你就可以从 users_table 中获取活跃用户和计数为 0 的用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2014-12-27
    • 2023-03-24
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多