人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL5.1のSQL文に関する質問です。
以下の2つのテーブルをjointし(3)の形で配列を作りたいのですが、SQL文はどのように書けばいいでしょうか?
・i_idでジョイント
・item_tblにあるアイテムはすべて出力
・zaiko_tblのu_idが2のレコードのみを抽出
・上記2つの条件をかなえflagで抜けているところはnull
・配列のu_idで抜けているところは、2が入ってくれると嬉しいがsqlでできない場合nullでもok
よろしくお願いします。

(1)テーブル名:item_tbl(Pkey i_id)
i_id, i_name
1, aaa
2, bbb
3, ccc
4, ddd
5, eee

(2)テーブル名:zaiko_tbl(Pkey u_id, i_id)
u_id, i_id, flag
2, 1, 0
6, 3, 1
8, 2, 1
2, 2, 1
9, 4, 0
8, 4, 1
2, 4, 1

出力したい配列
i_id, u_id, i_name, flag
1, 2, aaa, 0
2, 2, bbb, 1
3, 2, ccc, null
4, 2, ddd, 1
5, 2, eee, null


●質問者: seadwell
●カテゴリ:ウェブ制作
✍キーワード:AAA CCC DDD FLAG SQL
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● あすか
●28ポイント

こんな感じでどうでしょう。

SELECT item_tbl.i_id AS i_id, zaiko_tbl.u_id AS u_id, item_tbl.i_name AS i_name, zaiko_tbl.flag AS flag FROM item_tbl LEFT JOIN zaiko_tbl ON item_tbl.i_id = zaiko_tbl.i_id WHERE u_id = 2;
◎質問者からの返答

ご回答ありがとうございます。

これは試したんですが、zaiko_tblに一件もデータが入っていないと空が出力されるんですよ。

なんででしょうね?

私もこれで取れると思ったんですが・・・。。

『item_tblにあるアイテムはすべて出力』の条件は生きてほしいのです。

つまり、2で抽出するデータがない場合item_tblの一覧にnullだらけの配列がほしいのです。

ちなみに、WHEREを外すとすべて出力されますので記述にバグはないと思います。


2 ● うぃんど
●100ポイント ベストアンサー

SQLの処理手順はFROM、LEFT JOIN、WHERE、SELECTの順に実施されますので、下記(1)のように先に絞り込んでおくか、(2)のように最後に付けるかといった対応になります

(1)

SELECT a.i_id
 , 2 AS u_id
 , a.i_name
 , b.flag
FROM item_tbl a
LEFT JOIN (SELECT i_id, flag FROM zaiko_tbl WHERE u_id = 2) b ON b.i_id = a.i_id
;

zaiko_tblテーブルに該当するレコードが複数あってもちゃんと出力できる

(2)

SELECT a.i_id
 , 2 AS u_id
 , a.i_name
 , (SELECT b.flag FROM zaiko_tbl b WHERE b.u_id = 2 AND b.i_id = a.i_id LIMIT 1) AS flag
FROM item_tbl a
;

zaiko_tblテーブルに該当するレコードが複数あるとエラーになってしまうためLIMIT 1として制限をかけている

最新のデータのみでよい場合などは下記のようにして絞り込む

 , (SELECT b.flag FROM zaiko_tbl b WHERE b.u_id = 2 AND b.i_id = a.i_id ORDER BY 日付 DESC LIMIT 1) AS flag

どちらを採用するかは必要性(複数レコードの場合の取り扱い方)でまずは選びます

どちらでも良い場合はEXPLAINで実行計画を読み取ります(これは難しい作業となりますので、初心者のうちは飛ばしても良いです)

プロでも最終的に行うことですが、実運用と同じような量と質のテストデータを用意して実際に作動させて速度の違いを調べたりもします

◎質問者からの返答

前回に引き続き丁重なご回答ありがとうございます。

動作を確認しました。


> FROM、LEFT JOIN、WHERE、SELECTの順に・・・

こんなの初めて知りました。

また、SQL文もはじめてみる文法です。前回いろいろな組み合わせといっていた意味がほんの少し判った気がしました。

> EXPLAINで実行計画を読み取ります

これもはじめて聞きました。私なりに早速調べてみます。

初めてだらけでとても勉強になった回答でした。

ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ