

はじめてご質問させていただきます。
現在以下のようなテーブルが3つあります。
[ tbl1 ]
| tbl1Key | title |
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
[tbl2]
| tbl2Key | tbl1Key | tbl3Key |
| 1 | 2 | 2 |
| 2 | 3 | 1 |
| 3 | 3 | 4 |
| 4 | 1 | 3 |
[tbl3]
| tbl3Key | value |
| 1 | aaa |
| 2 | bbb |
| 3 | ccc |
| 4 | ddd |
上記のデータソースを元に以下のような結果を得たいと考えています。
array(
array( 'tbl1Key'=>1, 'title'=>'a', 'values' => array( array( 'tbl3Key'=>3, value='ccc' ) ),
array( 'tbl1Key'=>2, 'title'=>'b', 'values' => array( array( 'tbl3Key'=>2, value='bbb' ) ),
array( 'tbl1Key'=>3, 'title'=>'c', 'values' => array( array( 'tbl3Key'=>1, value='aaa'), array( 'tbl3Key'=>4, value='ddd' ) ),
array( 'tbl1Key'=>4, 'title'=>'d', 'values' = > array( array( 'tbl3Key'=> , value='' ) )
)
この場合phpによって
$sql = ("select * from `tbl1`");
$res = mysql_query( $sql, $con );
$data = array();
while( $row =mysql_fetch_object( $res ) )
{
$sql = ("select * from `tbl3`
inner join `tbl2` on `tbl3`.`tbl3Key`=`tbl2`.`tbl3Key`
where `tbl2`.`tbl1Key`={$row->tbl1Key}");
$res2 = mysql_query( $sql, $con );
$tmp = array();
while( $r = mysql_fetch_object( $res2 ) )
{
$tmp[] = $r->value;
}
$row->values = $tmp;
$data = $row;
}
まずtbl1のデータをすべて取り、配列dataに格納する段階で、tbl1と関連付けされたtbl3のvalueを取得し配列tblに格納、それを新しい要素として配列dataにプッシュしている状況です。
こういったテーブルでいうところの1カラムのみ配列で返すような事は、こういったループを使って以外にも可能なのでしょうか。
よろしくお願いいたします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
sql文の発行は一回でやった方が、時間的ロスは少ないと思うのだけど、取得データは基本的には2次元配列になる。
そこで、keyチェックしながら、配列作り直しという手順になるかとおもう。<?php
/* 3つのtable全部連結して一覧tableにする 、tbl1keyカラムでソートしておく */
$sql = <<<SSS
select tbl1.tbl1key as t1key, tbl1.title as t1title, tbl3.tbl3key as t3key, tbl3.title as t3title
from tbl1 left join tbl2 on tbl1.tbl1key = tbl2.tbl1key
left join tbl3 on tbl2.tbl3key = tbl3.tbl3key
order by t1key
SSS;
$res = mysql_query( $sql, $con );
$data = array();
$t1 = ''; $i=-1;
/* $t1: t1keyカラム値の重複チェック用 , $i: $dataの配列添え字用
$data を t1keyカラム値をキーとする連想配列にした方が、これらの変数が不用になるけど
*/
while( $row =mysql_fetch_array( $res ) ){
if( $t1 !== $row['t1key'] ){
$t1 = $row['t1key'];$i ++;
$data[$i] = array('tbl1Key'=>$row['t1key'], 'title'=>$row['t1title']
, 'value'=>array( array('tbl3Key'=>(isset($row['t3key'])?$row['t3key']:''), 'value'=(isset($row['t3title'])?$row['t3title']:'') ) ));
}else{
$data[$i]['value'][] = array('tbl3Key'=>$row['t3key'], 'value'=$row['t3title']);
}
}
var_dump($data);
無事動作を確認いたしました。
やはりループでチェック、追加という形にならざるを得ないんですね。
GROUP_CONCATを使用し表示時にバラして使用するという方法もやってみましたが、やはりスピード的にはいずれもという感じでした。
とても参考になりました。ありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Visual Basic(VBA) VBAコードで質問があります 2 2022/10/20 15:27
- Visual Basic(VBA) フォーム上のリストボックスに重複して表示しています 3 2022/10/19 11:55
- Visual Basic(VBA) VBAチェックボックスで有効無効切り替えできるように 5 2022/10/21 16:13
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 4 2023/05/26 10:43
- Visual Basic(VBA) VBA チェックボックスの設定について 1 2022/10/24 10:27
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- JavaScript java keyを配列で表記したい 10 2022/12/01 17:53
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
PHP初心者の質問object(stdClass)
-
文字列の並び替え
-
Eclipseコンテンツアシストでプ...
-
文字列の取得について
-
連想配列に追加ってできるン?
-
かなでの並び替え
-
特定の文からメールアドレスの...
-
PHPは何故値渡しより参照渡しの...
-
php foreach 配列のソート方法
-
数独かを判断するプログラム
-
C++ VS2005におけるイテレータ...
-
配列の複数の値のデータベース...
-
一致しないデータも表示させたい
-
phpの質問です
-
String だと「 ByRef引数の型が...
-
$_SESSIONに二次元配列を使える...
-
CSV読込(fgetcsv関数)で「手...
-
C#のキャスト?
-
$_POSTを一括してサニタイズし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
行列
-
CArrayの要素としてCStringArra...
-
Texでの数式
-
読み(あ行~わ行)ごとに分け...
-
CArrayのソート
-
C言語 最大値と最小値を求めて...
-
fgetc関数について
-
PHPのmin関数、「1」以上の数値...
-
連想配列の文字コードを変換
-
STLのvectorで作った配列をメン...
-
C言語のchar ポインタ
-
C言語で全角文字の扱いについて
-
配列を指定した順序でソート
-
php で1から100までの素数の表...
-
delphi 2次元配列がわかりません
-
np.stack()とnp.array()の違い
-
array_intersectで空欄を比較し...
-
cakephpでのトランザクション処...
-
verilogで、配列の一部をタスク...
おすすめ情報