忍者ブログ

カウンター

プロモーション

カレンダー

04 2024/05 06
S M T W T F S
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

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


  • 2024/05/04 00:37

PHP のMySQL(i) 関数fetch_array はLEFT JOIN やRIGHT JOIN の結合でコマンドラインと違う結果を出す事の対処方法

PHP の調べ物

何時もながらメモです。。。。。


非常に困った事があり、結合であれこれやっていた。

まず今回使う例としてのクエリー

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
には
  • テーブル A は、LEFT JOIN 条件で使用されるすべてのテーブル(B を除く)に依存するように設定される。

とある。

いやだけど、検索はテーブル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
  • RIGHT JOIN は LEFT JOIN の類似機能。コードをデータベース間で移植可能にするには、RIGHT JOIN ではなく LEFT JOIN を使用するようにする。

とあって、他のSQL を考慮すると、RIGHT は使わない方が良さそう。

だけど、なんだろう、どっちにしても3.にもある様に、
SELECT の挙動も、*,カラムはOK で、カラム,* はNG だとある。

これもMySQL 特有だとすると、LEFT JOIN を使った所で、他のSQL には
正式なものでなかったり、動かないかもしれない・・・・・

なんだろう・・・・・なんだろう・・・・・なんだろう・・・・・・・・・・


うーん、とりあえずは、LEFT JOIN と、*,カラム のセットで動かしてみる。
RIGHT JOIN と * が好きな人は、そっち(未確認)でいいかも。

5.fetch_array は同一キー名となってしまうカラムはそのまま取り出せないんじゃないの?

まぁ、5.のタイトルのままです、手を加えてカラム名変えて表示するしかない?
ほぼ4.の言い方、見方を変えているだけですがw

うぅーん。。。。。。。。 うぅーーーーん。。。。。。。。

とりあえず、複数は取り出せないけれど、検索したカラムの値は、他のテーブルで
上書きして欲しくない事に関しては解決しました。

今日の所はこのくらいにしておいてやる;w;

      :
      :
      :
      :
      :

自分が忘れない為のメモでした<_ _>
そいでもってテヘペロ(๑´ڡ`๑)

拍手[0回]

PR


  • 2013/09/28 22:44

コメント一覧

  • お名前
  • Email

  • コメント

  • Vodafone絵文字 i-mode絵文字 Ezweb絵文字
  • パスワード
[PR]