0

LIKE 句を使用した SELECT クエリに問題があります。特定の 1 つのフィールドにカテゴリ ID を持つすべてのレコードを取得する必要があります。すべてのカテゴリ ID は次のように保存されます。

1;2;4;11;12;22;32;

何が起こっているかというと、次のクエリ

SELECT * FROM mytableWHERE catidsLIKE '%2;%'

カテゴリ ID 2 を持つすべてのレコードを選択しますが、カテゴリ 12、22、32 などのレコードも選択します。残念ながら、カテゴリ ID を格納するコードは変更できず、番号 2 は変数から読み取られます。その横に NOT LIKE 句を使用してみましたが、12、22、32、42 などを避けるために 10 回繰り返すことはできません...

空または ; でも数じゃない?上記の例で取得するカテゴリ ID が 1 の場合、文字列は数字の 1 で始まるため (左側に ; はありません)、11 も取得します。

ありがとうございました

4

3 に答える 3

3

適切な解決策は、テーブルを再設計してそのフィールドを正規化し、これらの ID をサブテーブルに格納し、レコードごとに 1 つの ID にすることです。その後、問題は解決します。

そうしないと、考えられるすべてのケースを処理するために醜い WHERE 句が必要になります。

WHERE
      catids = 2             // the only ID in the field
   OR catids LIKE '2;%'      // ID is at the START of the id list
   OR catids LIKE '%;2;%'    // ID is somewhere in the MIDDLE of the list
   OR catids LIKE '%;2'      // ID is at the END of the list

適切に正規化された設計がある場合、節は単純に次のようになります。

WHERE subtable.catids = 2
于 2013-05-22T14:58:03.090 に答える
0

2 番目 (および 3 番目) に、テーブルを再設計する必要があるという考えです。つまり、次のようなこともできます。

WHERE CONCAT(';', catids, ';') LIKE '%;2;%'
于 2013-05-22T15:05:57.223 に答える
0

REGEXP を使用してみてください...次のような...

SELECT * FROM mytable WHERE catids REGEXP '(\d|;|^)2;'
于 2013-05-22T15:17:00.400 に答える