2017-03-10 3 views
0

MySQLデータベースのテーブルを照会しようとしています。MySQLでAND ORを使用すると結果が返されません

基本的に、テーブルの列の値に基づいてクエリを実行する必要があります。だから、:

列A =値とthisIDは値

または列<値とthisIDが値

しかし、クエリがnullを返しているの配列であるが、データの配列である場合データベースにあります。

編集:テーブルの背景と私がやろうとしていること。

インターフェイスからのユーザは、ビジネスエリアを選択します。そのビジネスエリアには多くの子エリア(部門など)があり、そのエリアには各部門に割り当てられたユーザーが多数存在する可能性があります。だから私はこのクエリにユーザーと領域の配列を渡しています。

割り当てタイプは、エントリがユーザに割り当てられ、3であるので、私は、ユーザ(ID)がそうアレイである場合、チェックしたい場合は、次の、割り当てタイプが1又は2である場合r.assigned_type = 3 AND r.assigned_id IN(26102,26132,26133,26134,44749)

3未満の場合、エントリは領域(サイト/部門)に割り当てられます。領域(ID)が配列に含まれているかどうかを確認したいのですが:r.assigned_type < 3 AND r.assigned_id IN(10901,10937,10938,10939,10940,10941) ユーザと部門の両方のエントリがあり、ORを使用する必要がある場合があります。ユーザーと地域

正しい構文を使用していますか?私は文法上の誤りはありませんか?

SELECT `r`.`risk_id`, `r`.`assigned_type`, `r`.`risk_type_id`, `r`.`risk_name`, `r`.`next_review`, `r`.`last_review`, `r`.`status`, `a`.`area_name`, `u`.`first_name`, `u`.`last_name` 
FROM `risk_assessments` `r` 
LEFT JOIN `users` `u` ON `u`.`id` = `r`.`assigned_id` 
LEFT JOIN `areas` `a` ON `a`.`area_id` = `r`.`assigned_id` 
WHERE `r`.`org_id` = 78 
AND `r`.`risk_type_id` = 10 
AND `r`.`assigned` = '1' 
AND `u`.`privilege_level` <= 7 
AND ((`r`.`assigned_type` = '3' AND `r`.`assigned_id` IN(26102,26132,26133,26134,44749)) 
OR (`r`.`assigned_type` < '3' AND `r`.`assigned_id` IN(10901,10937,10938,10939,10940,10941))) 
+0

。私の頭の上から離れて、あなたは括弧の問題があるかもしれませんが、誰かがあなたを助けることができるようにあなたのロジックを明確に伝えるべきです。 –

+1

あなたは 'assigned_type'をチェックし、異なるJOINSの条件で2つの異なるクエリを書くためにコードでIF条件とELSE条件を使用できませんか? –

+0

CASEについては、列の値に応じて、問合せで大文字と小文字を使用できますか? – frobak

答えて

0

単純な条件変更を行い、与えられた例の結果を得るだけです。ここで

が更新クエリです:

SELECT `r`.`risk_id`, `r`.`assigned_type`, `r`.`risk_type_id`, `r`.`risk_name`, `r`.`next_review`, `r`.`last_review`, `r`.`status`, `a`.`area_name`, `u`.`first_name`, `u`.`last_name` 
FROM `risk_assessments` `r` 
LEFT JOIN `users` `u` ON `u`.`id` = `r`.`assigned_id` 
LEFT JOIN `areas` `a` ON `a`.`area_id` = `r`.`assigned_id` 
WHERE `r`.`org_id` = 78 
AND `r`.`risk_type_id` = 10 
AND `r`.`assigned` = '1' 
AND `u`.`privilege_level` <= 7 
AND `r`.`assigned_type` <= '3' 
AND `r`.`assigned_id` IN(10901,10937,10938,10939,10940,10941,26102,26132,26133,26134,44749) 
+0

しかし、ユーザーIDとエリアIDが同じである場合は、どうしてそれらを独立してチェックする必要があるのでしょうか?私はこれはおそらく起こりそうでないことを知っているが、私はこれを考慮する必要がある – frobak

+0

このシナリオでは、私はこのクエリがうまくいくと信じています。 –

1

あなたの結合条件を確認してください:両方のテーブルが同じrと合流するので

LEFT JOIN `users` `u` ON `u`.`id` = `r`.`assigned_id` 
LEFT JOIN `areas` `a` ON `a`.`area_id` = `r`.`assigned_id` 

それは間違っているようです。 assigned_id外部キー。

それはこのようにする必要があります:あなたが説明したロジックが順番にあなたがするつもりはないかもしれませんこれは、クエリにあるものと一致しない

LEFT JOIN `users` `u` ON `u`.`id` = `r`.`user_id` (foreign key for users table) 
LEFT JOIN `areas` `a` ON `a`.`area_id` = `r`.`area_id` (foreign key for areas table) 
+0

assigned_idが列です。それがユーザーIDであるかareaIDであるかは、割り当てられたタイプの列によって決まります – frobak

関連する問題