MySQL+PHPで、サイトを制作しているのですが、データの表示の仕方で悩んでいます。


まず、下記のテーブルデータをフィールド1の値でまとめて並べて表示したいのですが、どうすれば良いでしょうか?

tb1
フィールド1,フィールド2
1,name1
3,name2
3,name3
1,name4
2,name5
2,name6

表示方法

1(フィールド1のデータを見出しとして表示)
name1 name4

2(フィールド1のデータを見出しとして表示)
name5 name6

3(フィールド1のデータを見出しとして表示)
naem2 name3

上記の表示方法の様に表示したいのですが、こういう場合はどの様に記述するのが良いのでしょうか?
宜しくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2006/08/09 11:49:38
  • 終了:2006/08/09 21:20:52

ベストアンサー

id:bonlife No.3

回答回数421ベストアンサー獲得回数752006/08/09 17:34:34

ポイント50pt

個人的な意見になりますが、今回のような例ではSQLでややこしいことをするよりもプログラム側で対応した方が柔軟に対応できますし、全体でのレスポンスも向上すると思います。

SQLはシンプルなままにし、取得した値をチェックしながら、必要なものを出力させるサンプルを書いてみましたので、ご確認ください。

表示の具体的なイメージ(どのタグを使ってどう表示させるか)がつかめなかったので、単純に改行させるだけの表示にしました。

(表示部分の処理は少し汚い感じです…。)

必要に応じてTABLEでの出力にするなど、工夫してみてください。

<?php
// HTML出力用設定
mb_http_output('UTF-8');
header("Content-Type: text/html; charset=UTF-8");
// HTMLのヘッダー部分出力
print <<<EOF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>MySQL検索結果の表示テスト(単純に<br />で改行)</title>
</head>
<body>

EOF;
// MySQLに接続 (サーバ名、ユーザーID、パスワードは適宜変更)
$con = mysql_connect("localhost","user","password")
or die("MySQLに接続できません。");
// データベースを選択 (例では test を選択)
mysql_select_db('test');
$sql = "SET CHARACTER SET UTF8";
$result = mysql_query($sql);
// SQLで問合せ (フィールド名は英語に変更してます)
$sql = "SELECT field1, field2 FROM tb1 ORDER BY field1, field2;";
$result = mysql_query($sql);
// 以下表示処理
if (!$result) {
	print "検索結果を取得できませんでした。";
} else {
	while( $row = mysql_fetch_array($result) ){
		if ( $heading != $row['field1'] ){
		// 前回と$row['field1']の値が異なる場合、見出しを出力
			if ( $heading != "" ) {
				print "<br />\n"; // いきなり<br />が表示されるのを避ける
			}
			$heading = $row['field1'];
			print "見出し : " . $heading . "<br />\n";
			print $row['field2']; // 同じ見出しの中で1つ目の値を表示
		} else {
			print " " . $row['field2']; // 半角スペース区切りで2つ目以降の値を表示
		}
	}
}
// HTMLのフッター部分出力
print <<<EOF

</body>
</html>
EOF;
?>

参考になれば幸いです。

id:black_kenchan

有難う御座いました。

勉強になりました。

2006/08/09 21:19:13

その他の回答(4件)

id:llusall No.1

llusall回答回数505ベストアンサー獲得回数612006/08/09 16:19:53

ポイント10pt

select 

tblx.フィールド1as f1,

(

    select フィールド2 from tb1

    where フィールド1 = tblx.フィールド1

    limit 0,1

) f2_1,

(

    select フィールド2 from tb1

    where フィールド1 = tblx.フィールド1

 and フィールド2 not in (f2_1)

    limit 0,1

) f2_2

from

(

    select distinct フィールド1 from tb1

) tblx

order by tblx.フィールド1

※黒字部分を limit 1,1にしたかったのですが何故かエラーになるので工夫しました。

※MySQL5で確認済み

id:black_kenchan

phpで出力するときはどんな風に書けばよいですか?

2006/08/09 16:25:03
id:llusall No.2

llusall回答回数505ベストアンサー獲得回数612006/08/09 16:44:15

ポイント10pt

すみません。そこまでのご要望があるとは思いませんでした。

(SQL1発で取得できたので十分と思ってました。[とても悩みました])


PHPは全く判りません。ごめんなさい。

以下のサイトが参考になると思います。


MySQL 問い合わせ、レコード参照テスト のところが参考になると思います。

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_04.ht...

// MySQL 接続 のところ

  ここで接続文字列をセットしてください。

// MySQL DB 選択 のところ

  DB名をセットしてください。


// MySQL 問い合わせ のところ

  私のSQLをセットしてください。


※実行すると、SQLの実行結果が表示されると思います。

※テーブルタグで出力表示させたいのであれば、テーブルタグにデータを織り込んでprint 出力させれば良いのではないでしょうか?

id:black_kenchan

ありがとうございました。

2006/08/09 21:19:41
id:bonlife No.3

回答回数421ベストアンサー獲得回数752006/08/09 17:34:34ここでベストアンサー

ポイント50pt

個人的な意見になりますが、今回のような例ではSQLでややこしいことをするよりもプログラム側で対応した方が柔軟に対応できますし、全体でのレスポンスも向上すると思います。

SQLはシンプルなままにし、取得した値をチェックしながら、必要なものを出力させるサンプルを書いてみましたので、ご確認ください。

表示の具体的なイメージ(どのタグを使ってどう表示させるか)がつかめなかったので、単純に改行させるだけの表示にしました。

(表示部分の処理は少し汚い感じです…。)

必要に応じてTABLEでの出力にするなど、工夫してみてください。

<?php
// HTML出力用設定
mb_http_output('UTF-8');
header("Content-Type: text/html; charset=UTF-8");
// HTMLのヘッダー部分出力
print <<<EOF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>MySQL検索結果の表示テスト(単純に<br />で改行)</title>
</head>
<body>

EOF;
// MySQLに接続 (サーバ名、ユーザーID、パスワードは適宜変更)
$con = mysql_connect("localhost","user","password")
or die("MySQLに接続できません。");
// データベースを選択 (例では test を選択)
mysql_select_db('test');
$sql = "SET CHARACTER SET UTF8";
$result = mysql_query($sql);
// SQLで問合せ (フィールド名は英語に変更してます)
$sql = "SELECT field1, field2 FROM tb1 ORDER BY field1, field2;";
$result = mysql_query($sql);
// 以下表示処理
if (!$result) {
	print "検索結果を取得できませんでした。";
} else {
	while( $row = mysql_fetch_array($result) ){
		if ( $heading != $row['field1'] ){
		// 前回と$row['field1']の値が異なる場合、見出しを出力
			if ( $heading != "" ) {
				print "<br />\n"; // いきなり<br />が表示されるのを避ける
			}
			$heading = $row['field1'];
			print "見出し : " . $heading . "<br />\n";
			print $row['field2']; // 同じ見出しの中で1つ目の値を表示
		} else {
			print " " . $row['field2']; // 半角スペース区切りで2つ目以降の値を表示
		}
	}
}
// HTMLのフッター部分出力
print <<<EOF

</body>
</html>
EOF;
?>

参考になれば幸いです。

id:black_kenchan

有難う御座いました。

勉強になりました。

2006/08/09 21:19:13
id:namiheikun No.4

namiheikun回答回数75ベストアンサー獲得回数62006/08/09 17:48:25

ポイント15pt

PDOは使えますか?とりあえずPDOを使用して書いてみますね。

<?php

$db = new PDO("mysql:host=localhost;dbname=test","user","");

// SQL SELECT文

$sql = "SELECT * FROM tb1 ORDER BY フィールド1,フィールド2";

// QUERY実行

$stmt = $db->query($sql);

$savekey = "";

// HEADER出力

print "<html><head>Test</head><body>";

// FETCH全件の1件づつの処理

while ($data = $stmt->fetch(PDO::FETCH_OBJ)) {

// 保管キーと比較

 if ($savekey != $data->フィールド1) {

// 違うのなら見出し出力

  print "<br><br>";

// キーの保管

  $savekey = $data->フィールド1;

  print $data->フィールド1 . "<br>";

 }

// データの出力

 print $data->フィールド2 . " ";

}

// FOOTER出力

print "</body></html>";

?>

オーソドックスですが、キーブレイクで、出力してみました。

SQL文自身は、単なるORDER BY指定だけで呼んでみました。

id:black_kenchan

使えないみたいです。

しかし、参考になりました。

有難う御座います。

2006/08/09 21:19:15
id:Mook No.5

Mook回答回数1312ベストアンサー獲得回数3912006/08/09 21:01:06

ポイント15pt

本質門に対する回答は出揃っているようですし、いまさらながらの回答なので、ポイントは不要です。


また、すでに次の課題に進んでいるようですので、どうしようかとも思いましたが、せっかく書いたのと多少は参考になる部分があるかと思い、回答いたします。


基本的な考え方は bonlife さんと同様(bonlife さんの回答を見る前に本コードを書いていたのですが、偶然似た形となっていました)ですが、ループではなく関数を使用する方法で記述しています。


この利点は、関数内の処理をシンプルにすることにより、各クエリがシンプルになり、これにより可読性、更新処理が容易になる点があるかと思います。

<html>

<head>

<?php

function makeAllList() {

// DB に接続

    $conn = mysql_connect( "localhost", "dbuser", "dbpassword" );

    mysql_select_db( "testdb" );

// field1 をリスト

    $sql = "SELECT DISTINCT field1 FROM tb1 ORDER BY field1;";

    $res = mysql_query( $sql, $conn ) or die ("データ抽出エラー [field2]");

    while ( $row = mysql_fetch_array( $res, MYSQL_ASSOC ) ) {

// field1 に対するテーブルを作成

        makeOneList( $conn, $row["field1"] );

    }

    mysql_close( $conn );

}

function makeOneList( $conn, $fieldName )

{

    print '<table border=1 width="300">'."\n";

    print ' <th bgcolor="#f0f0f0">'.$fieldName."</th>\n";

    print " <tr><td>";

    $sql = "SELECT DISTINCT field2 FROM tb1 WHERE field1 = '". $fieldName . "' ORDER BY field2;";

    $res = mysql_query( $sql, $conn ) or die ("データ抽出エラー [field1]");

    while ( $row = mysql_fetch_array( $res, MYSQL_ASSOC ) ) {

        print $row["field2"]. " ";

    }

    print "</td></tr>\n";

    print "</table>\n";

    print "<br>\n";

}

?>

</head>

<body>

<?php makeAllList(); ?>

</body>

</html>

ご参考になれば幸いです。

id:black_kenchan

参考になりました。

ありがとうございます。

2006/08/09 21:17:32

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません