0

「奨学金」というテーブルがあり、「専攻」という名前のフィールドがあり、奨学金に関連する専攻のカンマ区切りの専攻名も含まれています。

フィールドに次の 1 つ (またはコンマで区切られた複数) を含めることができるとします: ビジネス、アグリビジネス、ビジネス管理、国際ビジネス。

誰かが「ビジネス」を専攻として検索している場合、「ビジネス」を一致として選択し、他のものを選択しないようにするにはどうすればよいですか?

私が最も近いのはこれですが、もっと良いかもしれないことはわかっています-私の正規表現能力はそれほど熱くありません。

SELECT scholarship_id, scholarship_award_name, scholarship_majors 
FROM scholarships 
WHERE scholarship_majors rlike '[, ][[:<:]]business[[:>:]][, ]'
OR scholarship_majors rlike '^[[:<:]]business[[:>:]][, ]'
OR scholarship_majors rlike '[, ][[:<:]]business[[:>:]]$'

「ビジネス」または「、ビジネス」または「ビジネス」、「ビジネス」で始まるフィールドをキャッチしようとしていますが、「ビジネス管理」などではありません...

何かアドバイス?

4

3 に答える 3

2

何かアドバイス?

データをカンマ区切りのリストに保存しないでください。これは非正規化されたデータであり、詳細を分離するのが難しいだけでなく、悪いデータ (タイプミス、大文字と小文字の区別など) が発生する傾向があります。

  1. MAJORSテーブルを定義します。

    • MAJOR_ID (主キー)
    • MAJOR_NAME
  2. 多対多テーブルを使用して、奨学金を 1 つ以上の専攻に結合します。

    SCHOLARSHIP_MAJORS

    • SCHOLARSHIP_ID (主キー、SCHOLARSHIPS テーブルへの外部キー)
    • MAJOR_ID (主キー、MAJORS テーブルへの外部キー)
  3. JOIN を使用して、専攻に基づいて奨学金を取得します。

    SELECT s.scholarship_id, 
           s.scholarship_award_name, 
           m.major_name
      FROM SCHOLARSHIPS s
      JOIN SCHOLARSHIP_MAJORS sm ON sm.scholarship_id = s.scholarship_id
      JOIN MAJORS m ON m.major_id = sm.major_id
     WHERE m.major_name IN ('a', 'b', 'c')
    

...メジャーの出力をカンマ区切りのリストにしたい場合は、GROUP_CONCAT 関数を使用します。

    SELECT s.scholarship_id, 
           s.scholarship_award_name, 
           GROUP_CONCAT(m.major_name) AS majors
      FROM SCHOLARSHIPS s
      JOIN SCHOLARSHIP_MAJORS sm ON sm.scholarship_id = s.scholarship_id
      JOIN MAJORS m ON m.major_id = sm.major_id
     WHERE m.major_name IN ('a', 'b', 'c')
  GROUP BY s.scholarship_id, s.scholarship_award_name
于 2010-09-03T19:31:38.010 に答える
0

次のような英字を禁止することで、SQLを改善することができました。

SELECT scholarship_id, scholarship_award_name, scholarship_majors 
FROM scholarships 
WHERE scholarship_majors rlike '[, ][^a-z][[:<:]]business[[:>:]][^a-z][, ]'
OR scholarship_majors rlike '^[[:<:]]business[[:>:]][^a-z][, ]'
OR scholarship_majors rlike '[, ][^a-z][[:<:]]business[[:>:]]$'

これは私が望んでいる方法でキャプチャしているようです!

このSQLステートメントを改善するためのアドバイスをまだ探しています。

于 2010-09-03T19:44:46.167 に答える
0

私が扱っているデータベースにはいくつかの CSV タイプのフィールドがあるため、正規表現との戦いに時間を費やしました。

ベンチマークは、これがより簡単な構文で良い方法であることを明らかにしました:

SELECT * FROM table WHERE FIND_IN_SET('string', my_field)

問題のフィールドは、CSV 文字列フィールドでなければなりません。私の問題に対する完璧な解決策。はい、多対多のテーブルがより正規化された方法であることを認めます。

于 2010-09-04T02:42:23.780 に答える