1

不完全なタイトルで申し訳ありません。これについても正しい方向へのポイントが必要です。コンマ区切りのテキスト フィールドに文字列を含むレコードを検索するためのクエリを作成しようとしています。私はMySqlとphpを使用しています。

レコードの例:

recordID | statuses[TEXT]
1010     | 102
1011     | 100,103
1012     | 100,106,201,300

検索したい彫像を別のテーブルの statues_dataset から照会します

statusName | statusCode | Yes/No
name1      | 100        |   
name2      | 101        |
name3      | 102        |  Yes
name3      | 103        |
name4      | 106        |  Yes

ここで、彫像 102 または 106 を含むすべてのレコードを検索したいと考えています。

これを 2 つのステップで解決し、必要なものに対して statues_dataset をクエリし、条件部分を連結して、基本的に次のクエリを取得します。

SELECT * FROM table AS t
WHERE t.statuses LIKE '%201%'
OR t.statuses LIKE '%206%'

またはこれ

SELECT * FROM table AS t 
WHERE FIND_IN_SET('201',t.statuses)
OR FIND_IN_SET('206',t.statuses)

私が望む結果が得られます:

    recordID | statuses
    1010     | 102
    1012     | 100,106,201,300

今、これを解決するためのより良い方法があるかどうか疑問に思っていました。できれば1つのクエリで。または、検索したい値のリストを作成する 2 つのクエリで。FIND_IN_SET(str,strlist) 関数を見ましたが、問題は複数の str が必要なことです。検索したい複数の値を入力できるように使用できる関数はありますか? 私はグーグルで調べましたが、適切に尋ねる方法がわからないのではないかと心配しています。

4

3 に答える 3

2

私はあなたの投稿をもう一度読みました、そしてあなたは「そして」ではなく「または」と言います。次のクエリは、探しているレコードを検索します。

select distinct r.*
from records r join
     statuses_dataset d
     on concat(',', r.statuses, ',') like concat('%,', d.status, ',%') and
        d.use = 'Yes'

ステータス文字列の前後にコンマを含めるように変更しました。これにより、クエリで「105」ではなく「、105」を検索して、「1050」などとの一致を防ぐことができます。

気が変わって、すべてのステータスを持つレコードが必要な場合、クエリはもう少し複雑になります。ここで、サブクエリの一致は、最初にコードに一致するすべてのレコードを検索します。次に、一致の数をカウントし、すべての個々のコードに一致するレコードを返します。

with matches as (select r.RecordId, count(distinct d.statuscode) as num_matches
                 from records r join
                      statuses_dataset d
                      on concat(',', r.statuses, ',') like concat('%,', d.status, ',%') and
                         d.use = 'Yes'
                 group by r.RecordId
                )
select r.*
from records r cross join
     (select count(distinct d.statuscode) as numyes
      from statuses_dataset
      where d.use = 'Yes'
     ) ssum join
     matches m
     on r.RecordId = m.Recordid and
        m.nummatches = ssum.numyes

count(*)の代わりにcountdistinctを使用すると、ステータステーブルの重複が処理されます。

于 2012-07-22T13:21:36.627 に答える
0

GROUP_CONCAT()機能を使ってみてください

SELECT recordID ,
       GROUP_CONCAT(statuses)
       FROM MyTable
       GROUP BY recordID ;
于 2012-07-22T12:41:03.807 に答える
0

DB スキーマを正規化して (手遅れでない場合)、ID, recordID, status1 つの recordID-status リレーションに対して 1 つの行のような行を格納する方がよいと思います。WHERE status in (X, Y, Z)これにより、単純な(そしてより効率的な)句でステータスをフィルタリングできます。recordID確かにインデックスとstatusフィールドを忘れないでください。

1 回限りのスクリプトを実行して、現在のデータセットを正規化された状態に変換するのは非常に簡単です。

于 2012-07-22T12:40:49.793 に答える