1

私は問題があります。IN両側に複数の値がある場合に (クエリで) ステートメントを使用する方法を知りたい- 私はクエリを書いています:

SELECT name FROM math_Details WHERE cric_ids in (1,2,3,4,8);

このクエリの問題はcric_ids列にあり、(, コンマ) で区切られた複数の値もあります。お気に入り(5,9,1,10,2)

私を助けてください?

4

2 に答える 2

1

MySQL の関数を繰り返し使用できます。FIND_IN_SET()

SELECT name
FROM   math_Details
WHERE  FIND_IN_SET(1, cric_ids) OR FIND_IN_SET(2, cric_ids)
    OR FIND_IN_SET(3, cric_ids) OR FIND_IN_SET(4, cric_ids)
    OR FIND_IN_SET(8, cric_ids)

このようなステートメントは、PHP で動的に構築できます。たとえば、PDOで準備済みステートメントを使用すると、次のようになります。

$set = [1,2,3,4,8];
$sql = 'SELECT name FROM math_Details WHERE FALSE'
     . str_repeat(' OR FIND_IN_SET(?, cric_ids)', count($set));

$qry = $dbh->prepare($sql);
$qry->execute($set)

ただし、他の人が言ったように、これはデータベース設計が不十分であることを示しています。データ構造を正規化cric_idsして、フィールドの代わりに、レコードmath_Detailsをそれぞれに関連付けるテーブルを作成することを検討する必要がありますcric

于 2012-06-07T13:25:42.740 に答える
0

ああ、あなたのデザインはめちゃくちゃなので、あなたが求めていることはほとんど不可能です。私が理解しているのは、あなたが持っているということです:

    Select name from math_Details where cric_ids in (1,2,3,4,8);

列は次のようになります。

| cric_ids |
-------------
|1,2,3,5,4 |
|5,8,6,12,3|
|78,6,2,4,6|
|5,7,8,9,1 |

数字で検索できるようにしたい....

結果は文字列またはvarcharであるため、好きなものは役に立ちません。したがって、可能なオプションは次のとおりです(各オプションに「好き」を使用する必要があることに加えて)

critics like '1' //wont work at least you only have 1 in your cric_ids
critics like '%1' // will work only if 1 is the last value
critics like '1%' //will work only if 1 is the first vaue
critics like '%1%' // will give you all values with 1, like 1, 10, 11, 111, 19, etc...

2つの選択肢があると思います、

  1. 完全なクエリを作成し、PHP 関数を使用して値を取得すると (配列に変換して値を取得できます)、とても遅くなります!.....
  2. データベースを再設計して (推奨)、それと将来の競合を修正します。

データベースエンティティ関係モデルと正規化をご覧ください。

于 2012-06-07T13:18:12.693 に答える