• ベストアンサー
  • すぐに回答を!

複数のテーブルに対しSQLでデータを取得する方法

下記の2つのテーブル、及びソースコードがあります。 【sample_db】 CREATE TABLE IF NOT EXISTS `sample_db` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, `path` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `path` (`path`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ; INSERT INTO `sample_db` (`id`, `name`, `path`) VALUES (1, '2010年', '.1.'), (2, '6月', '.1.2.'), (3, '28日', '.1.2.3.'); 【sample_students】 CREATE TABLE IF NOT EXISTS `sample_students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sample_db_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ; INSERT INTO `sample_students` (`id`, `sample_db_id`) VALUES (1, 1), (2, 2), (3, 3); 【ソースコード】 <body> <?php $link = mysql_connect('localhost', 'データベースユーザ名', 'データベースパスワード名'); mysql_select_db('データベース名', $link); $sql = <<<SSS SELECT `SampleDb`.`id` , `SampleDb`.`name` , `SampleDb`.`path` , `sample_students`.`id_count` FROM `sample_db` AS `SampleDb` LEFT JOIN ( SELECT count( `sample_db_id` ) AS `id_count` , `sample_db_id` AS `sample_db_id` FROM `sample_students` GROUP BY `sample_db_id` ) AS `sample_students` ON ( `SampleDb`.`id` = `sample_students`.`sample_db_id` ) ORDER BY `SampleDb`.`path` SSS; $query = mysql_query($sql, $link); $p = 0; while ($row = mysql_fetch_array($query)) { $starter= "\n"; $rp = intval( $row['depth'] ); if( $p< $rp ){ // 子の開始 $p ++; $starter .= "<ul><li>"; }else { if( ($dp= $p-$rp) >0 ){ $p = $rp; $starter .= str_repeat('</li></ul>', $dp); } $starter .= '</li><li>'; } echo "$starter $row[1]: $row[2] :【$row[3]】"; } echo "\n". str_repeat('</li></ul>', $p) ; mysql_close($link); ?> </body> 上記の表示結果は、下記のようになります。 【表示結果】 2010年: .1. :【1】 6月: .1.2. :【1】 28日9: .1.2.3. :【1】 これを下記のような表示結果に変更する事は可能でしょうか? 2010年: .1. :【3】 6月: .1.2. :【2】 28日: .1.2.3. :【1】 やりたい事は、2010年には、それ以下に所属する合計を出したいと思いました(6月なども同様です)。 現在は、2010年そのものしか出せておりません。 pathフィールドの検索の仕方を考慮する必要があると思いましたが、どのようなSQL文を書けば良いか分からなかった為、 アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数99
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • yambejp
  • ベストアンサー率51% (3827/7415)

命題がいまいちぴんとこないのですが、 単純に「自分を含む自分以下のデータの合計」ならこんな感じ SELECT id,name,path ,(SELECT count(*) FROM `sample_db` AS S2 WHERE S2.path LIKE CONCAT(S1.path,'%')) AS count FROM `sample_db` AS S1 これがstudentとどうからむのか仕様がはっきりしませんね

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 ご教示いただいたソースを試した所、意図した動作になりました。 命題はご指摘の通り「自分を含む自分以下のデータの合計」となります。 ご指摘の言葉が思いつかず、上記のような分かりにくい質問になってしまい、申し訳ございません。 なお、student はとりあえず仮につけた名前で特に意図はありません。 あくまで「自分を含む自分以下のデータの合計」を取得する方法を知りたかっただけとなります。 このたびはどうもありがとうございました。 以上、よろしくお願いします。

関連するQ&A

  • DBの値を基にliにulをネストしたリスト作成

    http://soft.fpso.jp/develop/php/entry_2790.htmlのようなphpでliにulをネストしたリストを作成したいと思います。 上記ページでは入れ子構造の配列を用意し実現していましたが、 下記のようなデータベースで同様の事を実現する方法がわからなかったので、 アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 なお、データベースのサンプルはあくまでサンプルのため、別途必要なフィールドなどがありましたら、その旨ご指摘いただければと思います。 【データベースのサンプル】 CREATE TABLE IF NOT EXISTS `sample_db` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, `path` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `path` (`path`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ; INSERT INTO `sample_db` (`id`, `name`, `path`) VALUES (1, '2010年', '.1.'), (2, '6月', '.1.2.'), (3, '28日', '.1.2.3.'), (4, '12時', '.1.2.3.4.'), (5, '13時', '.1.2.3.5.'), (6, '29日', '.1.2.6.'), (7, '30日', '.1.2.7.'), (8, '7月', '.1.8.'), (9, '8月', '.1.9.'); 【ソースコードのサンプル】 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>タイトル</title> </head> <body> <?php $link = mysql_connect('localhost', 'データベースユーザ名', 'データベースパスワード名'); mysql_select_db('データベース名', $link); /* ▼▼▼ここから下の記述が分かりません。▼▼▼ */ $query = mysql_query("SELECT * FROM sample_db", $link); ?> <ul id="id_ul"> <?php while ($row = mysql_fetch_array($query)) { ?> <li class="class_li"><?php echo $row["name"]; ?></li> <?php } ?> </ul> /* ▲▲▲ここから上の記述が分かりません。▲▲▲ */ <?php mysql_close($link); ?> </body> </html> 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 2つのテーブルからデータ取得

    いつもお世話になっております。 以下のようなテーブルがあります。 ---------- CREATE TABLE IF NOT EXISTS `students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `student_number` bigint(20) DEFAULT NULL, `name` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ---------- CREATE TABLE IF NOT EXISTS `student_upload` ( `student_number` bigint(20) NOT NULL, `upload_id` int(11) NOT NULL ) ---------- データは以下のように登録されています。 students ---------- id|student_number|name 1 |11111     |いちろう 2 |22222     |じろう 3 |33333     |さぶろう student_upload ---------- student_number|upload_id 11111     |1 11111     |2 22222     |1 22222     |2 ---------- student_upload.upload_id=1 のデータを取得したいので 下記のようなSQL文を発行しているのですが、student_upload.upload_id=2 の データも取得されてしまいます。 select * from students s, student_upload up where up.upload_id=1 and up.student_number=s.student_number よろしくご教示お願いいたします。 <環境>  PHP:5.3.5  MySQL:5.0.7

    • ベストアンサー
    • MySQL
  • 年月の情報だけを基に階層構造を作る方法について

    下記のテーブルのような年月の情報だけを基に、添付ファイルのような階層構造を作成する事は可能でしょうか? CREATE TABLE IF NOT EXISTS `sample_db` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `year` varchar(255) NOT NULL, `month` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; INSERT INTO `sample_db` (`id`, `year`, `month`) VALUES (1, '10', '3'), (2, '10', '3'), (3, '10', '4'), (4, '11', '2'), (5, '11', '10'), (6, '12', '3'), (7, '12', ''), (8, '12', '5'), (9, '12', '5'); なお、http://www.makizou.com/archives/1662に記載されているpath情報をデータベースに持つ方法であれば、http://okwave.jp/qa/q6405985.htmlでご教示いただいた方法で実現できましたが、既存のデータベースで下記のような情報しか無い場合に実現可能か否か分からなかったので、 アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • AUTO_INCREMENT を複数のテーブルに跨がす事って可能でしょうか?

    PHP+MySQLで AUTO_INCREMENTを使用してidを管理したいんですが 複数テーブル(test1,test2)に 同じ「tourokou_id」というカラムが あります。 両方のtourokou_idをAUTO_INCREMENTすると test1 1 2 3 4  ・・・・・ test2 1 2 3 4  ・・・・・ となってしまいますよね。 これを test1 1 3 4   ・・・・・ test2 2   5 ・・・・・ という風にしたいんですがどのようにすればいいんでしょうか? そもそもできるんでしょうか?

    • ベストアンサー
    • MySQL
  • sql文について

    phpとmysqlの参考書を購入したのですがわからないことがあり 質問させてください。 参考書のサンプルとしてsample.sqlには以下の内容があります。 CREATE TABLE IF NOT EXISTS `author` ( `author_id` int(11) NOT NULL auto_increment, `author_name` varchar(255) NOT NULL default '', `author_name_kana` varchar(255) NOT NULL default '', `state` int(11) NOT NULL default '0', `description` text NOT NULL, PRIMARY KEY (`author_id`), KEY `author_name` (`author_name`), KEY `author_name_kana` (`author_name_kana`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; PRIMARY KEY (`author_id`),まではわかるのですがそれ以下の KEY ・・・とはなんのためにあり何をするのでしょうか? PRIMARY KEY・・・は主キーをauthor_idにするという設定かと 思うのですがKEY ・・・について意味がわかりません。 基本的すぎる事なのか参考書に説明がありませんでした^^; 詳しい方おりましたらわかりやすく教えて頂けますと幸いです。 宜しくお願い致します。

  • ODBC経由でMySQL5.0に auto_increment属性などを付加したテーブルを作成したい

    ODBC経由でMySQL5.0に auto_increment属性など付加した以下のテーブルを作成したいのですがODBCのSQL文はどう書けばよいのでしょうか? DROP TABLE IF EXISTS test; CREATE TABLE IF NOT EXISTS test ( a1 int(11) NOT NULL auto_increment, b1 enum('public','group','private') NOT NULL default 'public', c1 date NOT NULL default '0000-00-00', d1 mediumtext NOT NULL, PRIMARY KEY (`a1`) ) TYPE=MyISAM AUTO_INCREMENT=1 ; よろしくお願いします。

  • mySQLでのテーブル作成についての質問

    テーブル内の列で Field || Type || Null || Key || Default || Extra ID | int(6) | YES | UNI | NULL | auto_increment と言うテーブルを作成するにはどう記述したら良いのでしょうか? auto_incrementを指定した場合はフィールドにNULLを許可する事は出来ないのでしょうか?

  • テーブル作成時に1289エラーが出る。

    テーブル作成時に、ERROR 1289 (HY000): The 'InnoDB' feature is disabled; you need MySQL built with 'InnoDB' to have it working というエラーが出てしまいます。 どういった原因が考えられるでしょうか? Mysql5.0.15を使っています。 CREATE文 CREATE TABLE USER ( ID BIGINT NOT NULL AUTO_INCREMENT ,NAME VARCHAR(30) ,PRIMARY KEY (ID) ) type=InnoDB;

  • 空きのID番号を取得する方法

    いつもお世話になっております。 create table AAA( ID int(6) primary key not null auto_increment, DATA varchar(30), )engine=MyISAM; というテーブルにおいて、 insertをすると、IDが1から順に割り振られていきますが、 途中のレコードをdeleteすると、そこが空きのID番号となってしまい、 次にinsertすると、空き番号が残ってしまいます。 やりたいことは、その空き番号を有効活用するために、 auto_incrementを使用せずに、空き番号を適当に取得して、 insertをしたいのです。 何か効率的な良い方法をご存知の方がいらっしゃいましたら、 ご教授いただけると幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 取得データの置き換え方法

    SQL文で取得した情報(ID)を、文字列に変えてまた配列に戻したいのですがどのようにすればいいのかわかりません。 以下で、A.CODEで取得する値は1、2、3というようなIDになります。 この情報を、$siteに入れる際に、「1なら北海道」「2なら東北」というように入れ替えてやりたいのです。 直接情報を入れ替える方法や、別の配列に入れ替えてそれを$siteに入れる等、方法はあると思うのですが、どうしたらいいかわかりません。 よろしくお願いします。 $sql="select A.AREA_ID,A.NAME,A.CODE"; $line = mysql_num_rows($rs); $rs = mysql_query($sql,$db); for($j=0;$j<$line;$j++) { $row = mysql_fetch_row($rs); $site = "$row[1],$row[2],";

    • ベストアンサー
    • PHP