8

私の理解では、IN は次のように機能します。

$arrayName = array(1, 2, 3);

SELECT * 
FROM tableName 
WHERE productID IN ($arrayName)

は次と同等です。

SELECT * 
FROM tableName 
WHERE productID = 1 OR productID = 2 OR productID = 3

IN のように機能するが、OR の代わりに AND を使用して配列と比較する SQL 関数があるかどうか疑問に思っています。これに展開されるもの:

SELECT * 
FROM tableName 
WHERE productID = 1 AND productID = 2 AND productID = 3

必要というわけではありませんが、文脈上、jQuery を介して PHP ページに取り込まれているいくつかの検索結果の並べ替えリストを作成しているだけです。PHP で必要なことを行うことができます。ユーザーが選択したオプションに応じてクエリを動的に作成するだけですが、可能であればインテリジェントな SQL 関数を使用したいと考えています。

***編集: 助けてくれてありがとう。私は自分の問題を非常に不十分に説明しましたが、あなたはまだそれを整理することができました. 他の誰かがこの質問をもっと雄弁に尋ねて、私が使用できる答えを受け取ったことがわかった:

IN のような MySQL に、OR の代わりに AND を使用するものはありますか?

回答を受け入れてこれを閉じる方法を見つけようとしていますが、少し問題があります...

4

3 に答える 3

3

あなたはおそらくこれを行うことはできません、

SELECT * 
FROM tableName 
WHERE productID = 1 AND productID = 2 AND productID = 3

false行はその列に 1 つの値しか持てないため、条件は常に返されます。これを行う別の方法は、結果をグループ化することです。

SELECT colName
FROM tableName
WHERE productID IN (1,2,3)
GROUP BY colName
HAVING COUNT(DISTINCT colName) = 3

condition を持つことにより、これは、レコードのインスタンスが句HAVING COUNT(DISTINCT colName) = 3で指定されたパラメーターの総数と等しくなければならないことを意味します。IN

于 2012-09-21T14:19:18.913 に答える
3

書かれているように、クエリは行を生成しません。行の productID が同時に 1 と 2 の両方になることはできません。

これら 3 つの製品を含む行のグループを探している可能性があります。3 つの製品すべてを含む注文を検索するとします。次のようなものを使用できます。

select orderid
from orderlines ol
group by orderid
havnig max(case when ol.productid = 1 then 1 else 0 end) > 0 and
       max(case when ol.productid = 2 then 1 else 0 end) > 0 and
       max(case when ol.productid = 3 then 1 else 0 end) > 0

HAVING 句を指定した GROUP BY は、3 つの製品すべてが存在する注文を検索します。

于 2012-09-21T14:21:27.457 に答える
2
SELECT orderid 
FROM tableName  
WHERE productID IN (1, 2, 3)
GROUP BY orderid
HAVING COUNT(DISTINCT productID) = 3 --this number must match the number of unique IDs in the IN clause
于 2012-09-21T14:23:47.770 に答える