0

Ruby on Rails v3.2.2 と MySQL データベースを使用しています。次のようなデータを含むデータベーステーブルがあります(注:column1コンマ区切りの文字列が含まれています):

id   | column1                          | column2 | columnM    
-----|-----------------------------------------------------
1    | one1                             | value1  |  ...
2    | one1, two1                       | value1  |  ...
3    | one1, two1, three1               | value1  |  ...
4    | one2                             | value2  |  ...
5    | one2, two2                       | value2  |  ...
6    | one2, two2, three2               | value2  |  ...
...  | ...                              | ...     |  ...
1000 | oneN                             | valueN  |  ...
1001 | oneN, twoN                       | valueN  |  ...
1002 | oneN, twoN, threeN               | valueN  |  ...
1003 | oneN, twoN, threeN, fourN        | valueN  |  ...

に存在する 1 つまたは複数の文字列と同時に始まるレコードを取得するために、SQL クエリを作成したいと思いますcolumn1。つまり、たとえば、文字列column1を検索するとします。

Case 1: "thr"
Case 2: "two1 thr"
Case 3: "two thr"
Case 4: "wo"
Case 5: "one"
Case 6: "four one"

id次に、次のレコードをそれぞれ取得したいと思います。

Case 1: 3, 6, 1002, 1003                         # returns all records starting with "thr"
Case 2: 3                                        # returns all records starting with "two1" and at the same time starting with "thr" 
Case 3: 3, 6, 1002, 1003                         # returns all records starting with "two" and at the same time starting with "thr"
Case 4:                                          # nothing to return
Case 5: 1, 2, 3, 4, 5, 6, 1000, 1001, 1002, 1003 # returns all records starting with "one"
Case 6: 1003                                     # returns all records starting with "four" and at the same time starting with "one"

上記のように SQL クエリを動作させるにはどうすればよいですか(おそらく、ワイルドカードやその他の未知のものを使用することによって) 「単純な」検索エンジンを実装しようとしていますが、何についてアドバイスをいただけますか? 何か処方箋はありますか?

4

1 に答える 1

0

LIKE 句、つまりケース 2 を見てください。

SELECT *
  FROM TBL
 WHERE 1
   AND CONCAT(', ', column1) LIKE '%, two1%'
   AND CONCAT(', ', column1) LIKE '%, thr%'

ここでの秘訣は、検索される文字列がコンマ区切り項目の 1 つの先頭であること、つまり先頭,(カンマ スペース) であることを確認することです。これは最初の項目には存在しないため、=>CONCAT()を回して列に移動します。その後、LIKE パターンが適切に機能します。one, two1, one, two1

これWHERE 1は、1 つの条件で WHERE 句のシードを「消費」するパターンです。そのため、検索する必要がある単語ごとにAND式を追加できます。

   AND CONCAT(', ', column1) LIKE '%, someword%'
于 2012-11-07T18:11:15.510 に答える