何時もながらメモです。。。。。
非常に困った事があり、結合であれこれやっていた。
まず今回使う例としてのクエリー
SELECT * FROM group_state LEFT JOIN group_use ON group_state.group_number = group_use.group_number AND group_use.login_unique = 2;
これは2つのテーブル でつくられている。
片方のテーブルのカラムlogin_unique = 2 なのを探しているが、
今回そこは特に問題はない。
SELECT * FROM group_state LEFT JOIN group_use ON group_state.group_number = group_use.group_number;
だと思ってくれて良い(・・・・前途は忘れてw 斜線しときますw)
これを元に説明を残す。
1.MySQL をコマンドライン(やコンソール)で叩くと、2個のgroup_number があるがfetch_array では1つ
コマンドラインで覗いてみる。
ON group_state.
group_number = group_use.
group_number
とかで、両方group_number を指定しているから、両方出るんじゃないの?
+--------------+-----------------------------+--------------------+------------------+-----------+-----------+--------------+--------------+--------------+----------------+
| group_number | group_name | memo | view_unavailable | view_lock | unique_id | login_unique | group_number | default_view | view_weighting |
+--------------+-----------------------------+--------------------+------------------+-----------+-----------+--------------+--------------+--------------+----------------+
上記はColumnだけを切り出した、2個あるgroup_number
だけれど・・・・
PHP のmysqli の関数(mysqli でなくmysql にも確かあった?)に
http://php.net/manual/ja/mysqli-result.fetch-array.php
にある関数を使うと(長いので3のArrayのみの例)
3 =>
array
'group_number' => string
'4' (length=1)
'group_name' => string
'なんだろうテスト' (length=24)
'memo' => string
'なんだろう?' (length=18)
'view_unavailable' => string
'0' (length=1)
'view_lock' => string
'0' (length=1)
'unique_id' => null
'login_unique' => null
'default_view' => null
'view_weighting' => null
とか、group_number はひとつしか無いんだよね・・・・・
確かに配列は同じ名前で重なると困るけど、
これじゃ両方取り出せない!!!
ありえない・・・・・・・・・・・・
これがまず1つ気がついたこと。
2.その1つ、JOIN でくっつけると右か左のどちらかを元にして、結果を埋める。
http://dev.mysql.com/doc/refman/4.1/ja/left-join-optimisation.html
には
とある。
いやだけど、検索はテーブルBでも、見つかったときにはテーブルAから値を
持ってくる設定くらいつけて欲しいな。。。。。
Aで検索しても検索したカラムについては、Bの値を使って!ということ。
なんか言ってる事間違っているのだろうか?v?;
3.MySQLのSELECT の構文で、*,Column は受け付けるけど、Column,* はダメ
とりあえず、もう片側(今回はLEFT で検索していたので、RIGHTの方)の
検索結果が欲しい。
色々書いてみた。
SELECT
group_state.group_number,* FROM group_state LEFT JOIN group_use ON group_state.group_number =
group_use.group_number AND group_use.login_unique = 2;
うごかなぁぁぁーい”
じゃこっちにしてみよう・・・・
SELECT
*,group_state.group_number FROM group_state LEFT JOIN group_use ON group_state.group_number =
group_use.group_number AND group_use.login_unique = 2;
なんだそれ・・・・動いた・・・^w^;
+--------------+-----------------------------+--------------------+------------------+-----------+-----------+--------------+--------------+--------------+----------------+--------------+
| group_number | group_name | memo | view_unavailable | view_lock | unique_id | login_unique | group_number | default_view | view_weighting | group_number |
+--------------+-----------------------------+--------------------+------------------+-----------+-----------+--------------+--------------+--------------+----------------+--------------+
なんじゃこりゃwww
group_number が3つある・・・・・w
4.fetch_array は同一のカラムがあれば、最後のカラムの名前をキーにして配列を作る
その3つgroup_number がある状態で、fetch_array を実行すると、
なぜか最後(コマンドプロンプトで見て一番右側)のgroup_number を使って配列を作ってしまった!?
じゃこれ、最初からRIGHT JOIN を使えば解決したんじゃないの?とか思った・・・(未確認)
うん?でもここに
http://dev.mysql.com/doc/refman/4.1/ja/join.html
とあって、他のSQL を考慮すると、RIGHT は使わない方が良さそう。
だけど、なんだろう、どっちにしても
3.にもある様に、
SELECT の挙動も、*,カラムはOK で、カラム,* はNG だとある。
これもMySQL 特有だとすると、LEFT JOIN を使った所で、他のSQL には
正式なものでなかったり、動かないかもしれない・・・・・
なんだろう・・・・・なんだろう・・・・・なんだろう・・・・・・・・・・
うーん、とりあえずは、LEFT JOIN と、*,カラム のセットで動かしてみる。
RIGHT JOIN と * が好きな人は、そっち(未確認)でいいかも。
5.fetch_array は同一キー名となってしまうカラムはそのまま取り出せないんじゃないの?
まぁ、5.のタイトルのままです、手を加えてカラム名変えて表示するしかない?
ほぼ4.の言い方、見方を変えているだけですがw
うぅーん。。。。。。。。 うぅーーーーん。。。。。。。。
とりあえず、複数は取り出せないけれど、検索したカラムの値は、他のテーブルで
上書きして欲しくない事に関しては解決しました。
今日の所はこのくらいにしておいてやる;w;
:
:
:
:
:
自分が忘れない為のメモでした<_ _>
そいでもってテヘペロ(๑´ڡ`๑)
コメント一覧