2016-06-13 18 views
5
私は、次のSQLのために、 'カーディナリティ違反' エラーを取得しています

DBALカーディナリティ違反エラー

教義\ DBAL \例外の\ DriverException:で

SELECT p.* FROM mod_products_products p 
LEFT JOIN mod_products_products_categories c_link ON c_link.product_id = p.id 
LEFT JOIN mod_products_brands b ON p.brand_id = b.id 
LEFT JOIN mod_products_groups vg ON p.variation_id = vg.id 
LEFT JOIN mod_products_categories c ON c_link.category_id = c.id 
LEFT JOIN mod_products_group_options vg_o ON vg_o.group_id = vg.id 
LEFT JOIN mod_products_group_values vg_o_v ON vg_o_v.option_id = vg_o.id 
WHERE (p.name LIKE (?, ?)) AND (p.parent_id = 0) AND (vg_o.disabled=0) 
GROUP BY p.id ORDER BY p.name ASC 
LIMIT 18446744073709551615 OFFSET 0 

を実行中に例外が発生しましたparams ["%big%"、 "%light%"]:SQLSTATE [21000]:カーディナリティ違反:1241オペランドには1列が含まれている必要があります。

エラーは、 WHERE (p.name LIKE (?, ?))のパラメータリストで複数の値が定義されている場合にのみ発生します。

executeQuery()を使用しており、配列をConnection::PARAM_STR_ARRAYとして渡しています。元の声明では、私は問題点を次のように定義しています。

$builder->andWhere('p.name LIKE (:partial_names)'); 

partial_namesとして渡された配列が得られないようです。これを引き起こしていることに関するアイデア、およびそれを避ける方法は?

+0

も参照します。http:// stacko verflow.com/questions/1127088/mysql-like-in – bishop

+0

あなたは、mysql LIKEが複数の引数を受け入れることができると思いましたか? –

+0

@YourCommonSense 'foo LIKE( 'bar')'はMySQLで有効なので 'foo LIKE( 'bar'、 'baz')も有効であると考えるのは当然だと思います。 – bishop

答えて

8

MySQL LIKEは "文字列比較関数"であり、 "単純パターンマッチング"を使用して文字列を比較します。

をチェックすると、BNF grammar for LIKEは本質的に文字列と呼ばれるものである「文字のような」と「オクテットのような」引数だけを受け入れることがわかります。 (LIKE=がどのように動作するかは異なっているRHS上のバイナリ、文字と文字の一致、実行しているという事実の周りにいくつかの詳細があります:。foo LIKE 'bar'foo='bar'は異なる結果を生成することが)

このすべては、あなたを意味できません do LIKE ('a', 'b')柱状式('a', 'b')は文字列のようではありません。あるいは、奇妙な標準言語では、カーディナリティ(2)は、予想されるカーディナリティ(1)とは異なります。ただし、MySQLとSQLiteの(おそらく他のエンジン)でこれを行うことができます。

WHERE foo LIKE ('%bar') 

RHSのカーディナリティは1 LIKEが期待するものである、(1列がある)されているため。

foo LIKE IN ('a', 'b')と効果的に似たものが欲しいですが、どちらも存在しません(前述のSQL標準の理由)。 This Q&Aはその動作の回避策を示しています。REGEXPは受け入れられた回答に基づいています。

このエラーを回避するには、複数のLIKEまたはREGEXP、または多分FIND_IN_SETのようなものを使用するようにクエリを書き直す必要があります。

2

変更

(p.name LIKE (?, ?)) 

(p.name LIKE ? OR p.name LIKE ?) 

["%big%", "%light%"] 

"%big%", "%light%" 
関連する問題