MYSQLでの質問です。

下記の様なSQLにて検索を行った時、bテーブルになんらかのデータ(検索に関係のないデータでもいい)があると、
a.check=1の検索結果と(a.check=0 AND b.user_id=13) AND a.a_id = b.a_id)での検索結果が合わせて出力されますが、
bテーブルに1件もデータが入ってないと、本来a.check=1の部分で出力されるはずの件数も合わせて0件となります。
bテーブルにデータが入らない可能性がある場合、どのように指定すればいいでしょうか?
手前で、bテーブルにデータがあるなしのチェックを入れた場合は、検索クエリが増えるのでさけたいのですが。


SELECT * FROM a, b WHERE (a.check=1 OR ((a.check=0 AND b.user_id=13) AND a.a_id = b.a_id)) GROUP BY a_id


version: 5.0.48
php5
symfony1.1を利用

回答の条件
  • 1人3回まで
  • 登録:2009/01/09 10:53:54
  • 終了:2009/01/09 14:18:28

回答(3件)

id:yocchi24 No.1

yc24回答回数5ベストアンサー獲得回数02009/01/09 11:21:50

ポイント25pt

LEFT JOINを使えば取得できると思います。

サンプルを作ろうとしたのですが、元のSQLで何をしたいのか

よくわからなかったので出来ませんでした。

やりたいことをもう少し詳しく記述頂ければ、回答も詳しく出来ます。

id:chirubo

aテーブルに情報が入っていて、a.check=1の場合は閲覧、a.check=0の場合はbテーブルにuser_id、aテーブルのa_idが入っていてマッチしたuserのみ閲覧する内容になっています。

ですので今回は関係ありませんのでかいていませんがuserテーブルもあります。

お願いします。

2009/01/09 11:47:23
id:yocchi24 No.2

yc24回答回数5ベストアンサー獲得回数02009/01/09 12:42:27

ポイント25pt

以下の認識でよいでしょうか?

[テーブル構造]

・a.check=0の場合はbテーブルにuser_idと、a_idにはa.a_idの値が入っている

・a.check=1の場合はbテーブルにデータがない

この状態でa.check=0とa.check=1両方出すとaテーブルの全体が出てきちゃいますが…

最初のSQLでは、a.check=0 AND b.user_id=13とあるので特定のユーザIDのaテーブルの状況が

参照したいのかと思ったのですが違いますか?

グループ化している理由も含めて、どういった情報が欲しいのか教えてください。

LEFTJOINを使用して bテーブルにデータがなかった場合にどのようになるかの

参考SQLを記載しておきます。

SELECT *

FROM a

LEFT JOIN b

ON a.a_id = b.a_id

id:chirubo

left joinでうまく表示ができました。

a.check=1の場合と、(a.check=0 AND b.user_id=13)の場合でOR検索ができればよかったのですが、

left joinの使い方をよく理解していませんでした。

ありがとうございます。

2009/01/09 14:16:36
id:frkw2004 No.3

ふるるP回答回数192ベストアンサー獲得回数212009/01/09 13:26:49

ポイント30pt

外部結合(Left Join とかRight Join とか)を使いましょう。

SELECT * FROM a Left Join b On a.a_id = b.a_id

WHERE a.check=1 OR (a.check=0 AND b.user_id=13)

になるかな。

from句で a,b,c と書くのではなく、Left Join, Inner Join などのJoinを使って書くようにするといいです。a,b,・・・のように書くと直積となって、パフォーマンスが悪化することがあります。

id:chirubo

left joinでうまく表示ができました。

Joinを使った方がパフォーマンスがいいのですね。

ありがとうございます。

2009/01/09 14:17:34
  • id:frkw2004
    From a,b と書くだけだと直積で、aの件数×bの件数のレコード数でメモリ上にテーブルが展開されます。
    bに全くレコードがないと、上記の結果が0件になります。そのメモリ上に展開されたテーブルの結果に対してa.check=0の条件で検索をかけてもヒットしない、というのがレコードが見つからなかった原因です。

  • id:chirubo
    これでなぜ検索にhitしないのか理由がわかりました。
    直積の為だった(1件でもデータを入れるとHITするため)のですね。
    ありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません