質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

Q&A

解決済

2回答

1777閲覧

MysqlでJOINとWHEREと多用したら意図する絞り込みができなかった

kutu

総合スコア257

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

0グッド

0クリップ

投稿2016/07/08 01:56

編集2016/07/08 02:03

お世話になっております。
下記のようにJOINを多用しているSQL文を記載しました。

下部で

table000.province in ('hokkaido')

としています。
provinceの値が「hokkaido」以外の者も少量が検索されてしまいます。
JOINやWHEREの書き方に問題がありますのでしょうか?
お分かりになる方いらっしゃいましたらよろしくお願い致します

MySQL

1SELECT pps_pps_facility.name , pps_pps_facility.pps_province 2 FROM 3 table000 4 5 LEFT JOIN 6 table001 7 ON table000.id = table001.id_c 8 9 LEFT JOIN 10 table002 jt0 11 ON table000.pid = jt0.id 12 AND jt0.deleted=0 13 14 LEFT JOIN 15 table003 jt1 16 ON table000.uid = jt1.id 17 AND jt1.deleted=0 18 19 LEFT JOIN 20 table003 jt2 21 ON table000.uid=jt2.id 22 AND jt2.deleted=0 AND jt2.deleted=0 23 24 LEFT JOIN 25 table004 jt3 26 ON table000.sid = jt3.id 27 AND jt3.deleted=0 28 29 LEFT JOIN 30 table004 jt4 31 ON table000.sid1 = jt4.id 32 AND jt4.deleted=0 33 34 LEFT JOIN 35 table004 jt5 36 ON table000.sid2 = jt5.id 37 AND jt5.deleted=0 38 39 LEFT JOIN 40 table004 jt6 41 ON table000.sid3 = jt6.id 42 AND jt6.deleted=0 43 44 LEFT JOIN 45 table005 jtl7 46 ON table000.id=jtl7.idb 47 AND jtl7.deleted=0 48 49 LEFT JOIN 50 table006 jt7 51 ON jt7.id=jtl7.ida 52 AND jt7.deleted=0 AND jt7.deleted=0 53 54 LEFT JOIN 55 table007 jt8 56 ON table000.account_id1_c = jt8.id 57 AND jt8.deleted=0 58 59 LEFT JOIN 60 table007 jt9 61 ON table000.account_id2_c = jt9.id 62 AND jt9.deleted=0 63 64 where ((table000.province in ('tokyo','hokkaido')) 65 AND jt7.paid is null or jt7.paid = '') 66 AND table000.deleted=0 67 68 ORDER BY table000.date_entered DESC

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shi_ue

2016/07/08 02:00

なんでリストじゃないのにinを使うんですか?これからリストになるから?
kutu

2016/07/08 02:02

あ、そうです。 見やすくするためにinの中身を一つに減らしてしまいました
shi_ue

2016/07/08 02:06

selectのフィールドのpps_pps_facility ってテーブルは無いんですが・・・
guest

回答2

0

ベストアンサー

where ((table000.province in ('hokkaido'))
AND jt7.paid is null or jt7.paid = '')
AND table000.deleted=0

この書き方では解決順的に
(provinceがhokkaido かつ paidがNULL) または paidが''
なので、hokkaidoじゃなくともpaidが''なレコードが含まれています。
おそらく意図しているのはpaidがNULLか''のもの、だと思われますので、下記のように修正してみるとよいでしょう。

where (table000.province in ('hokkaido')
AND (jt7.paid is null or jt7.paid = ''))
AND table000.deleted=0

投稿2016/07/08 02:07

編集2016/07/08 02:08
masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

無用なカッコは付けないでシンプルに。

where table000.province in ('hokkaido')

AND (jt7.paid is null or jt7.paid = '')
AND table000.deleted=0

投稿2016/07/08 02:38

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問