ご注意ください

  • 当ブログのコメントやトラックバックに、アカウントハックサイトや、そのようなサイトへリダイレクト(転送)される可能性が高いサイトへのリンクが時々貼られているようです。
    そのようなサイトへのリンクが貼られたコメント・トラックバックは、見つけ次第削除・禁止ワード登録していますが、今後も危険なサイトへのリンクが貼られる可能性がありますので、安易にリンク先へ飛ばないよう充分ご注意ください。

オンラインゲーム関連

著作権表示

  • 当ブログに記載されている
    会社名・製品名・システム名などは、
    各社の登録商標、もしくは商標です。

    当ブログ上の文章・写真・画像の
    無断転載、無断転用、直リンクなどは
    行わないでください。

    (C) 1998-2016 Vertex.
    (C) 2002-2016 SQUARE ENIX CO., LTD.
    (C) CAPCOM CO., LTD. 2007, 2016

    All Rights Reserved.
無料ブログはココログ

« 2013年4月 | トップページ | 2013年6月 »

[MySQL] LEFT JOINがうまく動かない…?

とある在庫管理システムがあったとして、DBには4つのテーブルがあるとする。

shohin_master(商品マスタ)
maker_master(メーカーマスタ)
zaiko(在庫管理)
uriage(売上管理)

ここから、全商品に対する在庫数と売上数を抽出するVIEWを作りたかったので、以下のようなSELECT文を作ってみた。
※カラム名は実際に使っているものではなく、記事用に適当な名前をつけています

SELECT s.shohin_no, s.name, m.name, s.price, z.zaiko_num, SUM( u.uriage_num )
FROM shohin_master s, maker_master m
LEFT JOIN zaiko z ON s.shohin_no = z.shohin_no
LEFT JOIN uriage u ON z.zaiko_no = u.zaiko_no
WHERE s.shohin_no = z.shohin_no
AND s.maker_no = m.maker_no
GROUP BY z.zaiko_no;

イメージとしては、商品マスタとメーカーマスタに対して、在庫管理をLEFT JOINして、さらに売上管理をLEFT JOINしたかったのに、SELECTした結果は思い通りにはいかなかった。
つまり、
( ( shohin_master s, maker_master m ) LEFT JOIN zaiko z ) LEFT JOIN uriage u
という状況をイメージしていたのに、結果は
shohin_master s, ( maker_master m LEFT JOIN ( zaiko z LEFT JOIN uriage u ) )
となってしまっていたらしい。

どうやらMySQLでは、今までは前者で動いていたのに、いつぞやのバージョンアップ(詳しいバージョンは失念)から後者の動きになってしまったらしい?

前者のような動きをさせたかったら、明示的にカッコでくくらないといけなくなったんだとか。

そこで、FROM以降を以下のように書き換えたところ、イメージ通りの結果に。

FROM ( ( shohin_master s, maker_master m )
LEFT JOIN zaiko z ON s.shohin_no = z.shohin_no )
LEFT JOIN uriage u ON z.zaiko_no = u.zaiko_no

計算式を書くときもそうだけど、明示的にカッコでくくったほうが間違いがなくてイイヨネ。プログラムする側も、優先順位が分かりやすいし。

※記事用にSQL文を変更していますが、変更したせいで破綻したものになっていたらスミマセン(笑)

ツイッターで流れてきた話

電車内で電話をしている人の会話。

「親が死なないだと?子供は全員ぶっ殺してるのか?全員だよ全員。1人残らず殺してから親を殺さないとゾンビになるぞ!」

これを隣で聞いていたおばさんが震えていたらしい。

普通にこんな会話を聞いたら、そりゃ震えるだろう。ホラー映画かなにかかと思うかもしれない。どちらにしても、物騒な話なのは変わりないわけで。

でも、PG/SEの間では普通に会話に出てきたりする。

自分がやってきた仕事を例にすると、普段はメインプロセスとよばれる常駐型アプリが立ち上がっていて、何か処理要求が飛んでくると、このメインプロセス(親)がチャイルドプロセス(子)を立ち上げて、そちらに処理を任せる。

親プロセスは、子プロセスの処理が終わるのを待ち、子プロセスが処理を終えると、子プロセスを終了させる。

ただ、この「子プロセスを終了させる」処理が何らかの事情で終了できなかった場合、親プロセスは一定時間後に子プロセスをKillコマンドによって強制終了させる。この処理を直訳すると「殺す」になり、つまりは親プロセスが子プロセスを「殺す」のだ。

親プロセスが立ち上げた子プロセスは親側に処理を引き継いでから終了しないといけないので、逆に言えば「子プロセスが立ち上がっている状態では、親プロセスは(正常な処理上では)終了できない」状態にある。

そこで、例えば親プロセスに対してkillコマンドを投げてしまうとどうなるか。ほとんどの場合で、子プロセスが立ち上がったまま、親プロセスが強制終了して(死んで)しまう。

じゃあ、親プロセスがいなくなった状態で、子プロセスはどうなるか。子プロセスが終了する場合の処理を引き継ぐ親プロセスがいないので、子プロセスが完全に終了できないまま、宙ぶらりんになってしまう。この状態をゾンビプロセスという。

最初の電話の話をわかりやすくすると、「親プロセスが強制終了できないだと?子プロセスは全て強制終了しているのか?全部だよ全部。1つ残らず強制終了してから親プロセスを強制終了させないと、子プロセスがゾンビプロセスになってしまって残るぞ!」ということになる、と。

業界用語に近いものがあるのかなぁ。

解説になっていない解説でした(笑)

GW後半の初日

ニュースではさっそく渋滞○○kmなんて言っているし、JHのサイトを見てみれば至る所で事故発生中。今年のGW中の車事故、かなりの数になってるんじゃないかと心配になります。

仕事の方もひと段落したので、我が家で唯一スタッドレスタイヤのままだった妹のエスティマのタイヤ交換をしてきました。

妹は妹で、仕事で山間部を移動することも多いので、今年は特になかなか交換できなかったというのもあるらしい。現に、つい数日前に積雪がありましたし。

今日の気温は作業開始時点で15度。日差しが強かったせいもあってか、暑いのなんの。

そういえばここ数日、気温が氷点下近くなったり夏日になったりと、異常なほど上がり下がりしているのはなぜ。

« 2013年4月 | トップページ | 2013年6月 »

フォト
2017年5月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

最近のトラックバック