【问题标题】:SQL query in CodeIgniterCodeIgniter 中的 SQL 查询
【发布时间】:2018-09-26 10:31:26
【问题描述】:

我有一个关于 CI 模型的查询。我需要使这个查询简短。我需要获取每个字母表的前五个构建器名称。有什么办法可以缩短吗?

型号

public function getBuilders() {        
    $query1 = $this->db->select('builder_name')->from('builders_list')->where('builder_name like', 'a%')->limit('5')->get();
    $query2 = $this->db->select('builder_name')->from('builders_list')->where('builder_name like', 'b%')->limit('5')->get();
    $query3 = $this->db->select('builder_name')->from('builders_list')->where('builder_name like', 'c%')->limit('5')->get();
    $query4 = $this->db->select('builder_name')->from('builders_list')->where('builder_name like', 'd%')->limit('5')->get();
    $query5 = $this->db->select('builder_name')->from('builders_list')->where('builder_name like', 'e%')->limit('5')->get();
    $query6 = $this->db->select('builder_name')->from('builders_list')->where('builder_name like', 'f%')->limit('5')->get();
    $result1 = $query1->result();
    $result2 = $query2->result();
    $result3 = $query3->result();
    $result4 = $query4->result();
    $result5 = $query5->result();
    $result6 = $query6->result();
    return array($result1, $result2, $result3, $result4, $result5, $result6); 
}

【问题讨论】:

  • 也发布您的普通 SQL 查询。一些不了解 CI 的 SQL 专家也可以为您提供帮助。

标签: php mysql codeigniter


【解决方案1】:

您可以使用以下代码:

$this->db->select('builder_name')
         ->from('builders_list')
         ->like('name','a%')
         ->or_like('name','b%')
         ->or_like('name','c%')
         ->or_like('name','d%')
         ->or_like('name','e%')
         ->or_like('name','f%')
         ->limit(5)
         ->get();

【讨论】:

  • 我还会添加一个名为 ASC 的订单,以便 A 和 B 都在一起。
  • 这不会像 OP 所期望的那样工作。 OP 需要每个初始值的前五个结果(总共 30 个)。此建议在所有列出的首字母中产生前 5 个结果(共 5 个)
  • 嗨,我得到了这个结果,但没有查询为什么不在这个查询中 SELECT builder_name FROM builders_list WHERE builder_name LIKE '%a!%%' ESCAPE '!'或builder_name LIKE '%b!%%' ESCAPE '!'或 builder_name LIKE '%c!%%' ESCAPE '!'或 builder_name LIKE '%d!%%' ESCAPE '!'或 builder_name LIKE '%e!%%' ESCAPE '!'或 builder_name LIKE '%f!%%' ESCAPE '!'限制 5
【解决方案2】:

您可以通过多次调用模型来稍微缩短代码。

在控制器中:

$initials = array('a','b','c','d','e','f');
foreach ($initials as $initial)
{
  $result = $this->model->getBuilders($initial);

  // here you do something with the data that's returned in $result
}

在模型中:

public function getBuilders($initial)
{
$query = $this->db->select('builder_name')->from('builders_list')->where('builder_name like', $initial.'%')->limit('5')->get();
return $query->result();
}

因此,对于每个首字母,您将点击模型,该模型将为该首字母返回 5 个结果。用这些做任何你需要的事情,然后 foreach 将循环到下一个首字母,并将继续运行,直到最后一个首字母被查询。

【讨论】:

    【解决方案3】:

    您可以使用 . a% 后面的通配符 % 和其他你想找的,可以用

    $query1 = $this->db->select('builder_name')
             ->from('builders_list')
             ->like('name','a','after')
             ->or_like('name','b','after')
             ->or_like('name','c','after')
             ->or_like('name','d','after')
             ->or_like('name','e','after')
             ->or_like('name','f','after')
             ->limit(5)
             ->get();
    return $query1->result();
    

    谢谢

    【讨论】:

    • 这不会产生 OP 期望的结果,因为查询将在所有 6 个首字母中最多输出 5 个结果。 OP 预计每个初始值恰好有 5 个结果(总共 30 个)。更改为 limit(30) 也不起作用,因为无法确保这 30 个中恰好有 5 个以每个字母开头
    • 我得到了这个结果 SELECT builder_name FROM builders_list WHERE builder_name LIKE '%a!%%' ESCAPE '!'或 builder_name LIKE '%b!%%' ESCAPE '!'或 builder_name LIKE '%c!%%' ESCAPE '!'或 builder_name LIKE '%d!%%' ESCAPE '!'或 builder_name LIKE '%e!%%' ESCAPE '!'或 builder_name LIKE '%f!%%' ESCAPE '!'限制 5
    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多