0

我在 be_user_profiles.subject 中有以下示例。这些是每个老师教的科目ID。

1// English
1,2 // English and Math etc
1,2,14
2,4,114
12,24,34
15, 23

我想选择 be_user_profiles.subject 有 1 的位置。当我使用以下内容时,它会输出其中有 1 的所有内容。所以它会输出所有。我试过 HAVING 但它只选择完全匹配。所以它只显示第一个。如何获取具有 be_user_profiles.subject 的数据?

    $this->db->select('*');
    $this->db->from('be_user_profiles');
    $this->db->join('be_users', 'be_users.id = be_user_profiles.user_id');
    $this->db->where('be_users.group', $teachergrp);
    $this->db->like('be_user_profiles.subject', $subjectid);
    //$this->db->having("be_user_profiles.subject = $subjectid");// this picks up only exact match 
    $query = $this->db->get();

先感谢您。

4

3 回答 3

3

be_user_profiles 表

row1: 1,2,14

row2: 2,4,114

row3: 12,24,34

row4: 15, 23

要获取完全匹配的数据,请使用此查询

$this->db->query("
      SELECT * FROM `be_user_profiles` 
      WHERE subject LIKE '1'

      UNION

      SELECT * FROM `be_user_profiles` 
      WHERE subject LIKE '1,%'

      UNION

      SELECT * FROM `be_user_profiles` 
      WHERE subject LIKE '%,1,%'

      UNION

      SELECT * FROM `be_user_profiles` 
      WHERE subject LIKE '%,1'

   ");
于 2013-03-20T08:26:02.940 回答
1

both您放入like查询中的子句意味着%在要搜索的字符串的前后添加通配符,因此只要 12、21、121 等,它就会返回 1。如果删除它,它将仅搜索完全匹配。

您可以添加此like子句并为其添加逗号,我认为它会起作用。尝试添加这个而不是like你现在拥有的:

$this->db->like("," . "be_users.group" . "," , "," . $subjectid. "," , both);
于 2013-03-20T08:28:43.397 回答
0

我认为您可以在这里使用正则表达式模式。

$pattern = "(^|.*,)1(,.*|$)";
...
...
$this->db->select('*');
....etc
$this->db->where("be_user_profiles.subject REGEXP $pattern");

此正则表达式模式假定逗号字符串中没有空格。

然而,正如@halfer 在评论中所说,你真的,真的应该把它分成一个带有teacherid 和subjectid 列的“teachersubject”表,否则它很快咬你。[去过也做过 :-) ]

例如,想象一下试图将上述内容扩展到寻找教授((数学或物理)和英语)的老师。恶梦!

于 2013-03-20T09:08:53.297 回答