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クエリに入れる句は、検索する文字列の前後に widcardlikeを追加することを意味するため、%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 に答える