複数のテーブルに対し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文を書けば良いか分からなかった為、
アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。
お礼
遅くなり申し訳ございません。 その後アドバイス通り、結合せずそれぞれのクエリを受け取る事により解決しました。本当にありがとうございました。