人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: black_kenchan
●カテゴリ:ウェブ制作
✍キーワード:MySQL PHP サイト データ フィールド
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● llusall
●10ポイント

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で確認済み

◎質問者からの返答

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


2 ● llusall
●10ポイント

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

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


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

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


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

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

// MySQL 接続 のところ

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

// MySQL DB 選択 のところ

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


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

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


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

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

◎質問者からの返答

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


3 ●
●50ポイント ベストアンサー

個人的な意見になりますが、今回のような例では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;
?>

参考になれば幸いです。

◎質問者からの返答

有難う御座いました。

勉強になりました。


4 ● namiheikun
●15ポイント

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指定だけで呼んでみました。

◎質問者からの返答

使えないみたいです。

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

有難う御座います。


5 ● Mook
●15ポイント

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


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


基本的な考え方は 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>

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

◎質問者からの返答

参考になりました。

ありがとうございます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ