0

私はこのestructureを持つテーブルを持っています:

ID | level1 | level2 | level3

すべてのフィールドには整数が格納されます。次に、次のような配列があります: $array (1,2,8,9,15)

level1、level2、または level3 のいずれかのフィールドの配列に値を含むすべての行を取得したいと考えています。

私はこれを試します:

SELECT P.* FROM table P 
WHERE level1 OR level2 OR level3 IN (".$array.")

問題は、配列にたとえば数値 1 が含まれている場合、クエリは 10、11、12 の行を取得することです...

値を正確に一致させる方法はありますか?

4

3 に答える 3

3

問題はあなたがそう思うことではありません。現在書かれているように、level1 と level2 がブール値として評価されているため、クエリは level1 != 0 OR level2 != 0 OR level3 がリストにある任意の行を返します。

IN次のように、3 つの個別の句が必要です。

SELECT P.* 
FROM table P 
WHERE level1 IN (...) 
OR level2 IN (...) 
OR level3 IN (...) 
于 2013-04-04T20:03:18.580 に答える
1

IN セレクターは、配列内の値の 1 つと完全に一致する必要があります。ここでいくつかの問題があります。まず、次のようにすべてのフィールドに IN を指定する必要がないので、OR を使用することはできません。

SELECT P.* FROM table P 
WHERE
level1 IN (...)
OR level2 IN (...)
OR level3 IN (...)

第二に、次のようなことを試してみるように、配列を単にエコーアウトすることはできません:

$in_string = "'" . implode("','", $array) . "'";
$query = "SELECT P.* FROM table P 
    WHERE
    level1 IN ($in_string)
    OR level2 IN ($in_string)
    OR level3 IN ($in_string)";
于 2013-04-04T22:29:43.623 に答える
0

FIND_IN_SETを使用できます:

SELECT P.* FROM P 
WHERE
  FIND_IN_SET(level1, '".$array."') OR
  FIND_IN_SET(level2, '".$array."') OR
  FIND_IN_SET(level3, '".$array."')

ここでフィドルを参照してください。

于 2013-04-04T20:00:09.533 に答える