PHPとMysqlを使用した集計表の作り方

このQ&Aのポイント
  • PHPとMysqlを使用して集計表を作成する方法について説明します。
  • 上記のセレクト文で取れた結果をPHPにて集計表として表示する方法を教えてください。
  • 結果で取れていない媒体や日付も含めて、集計表に表示させる方法を教えてください。
回答を見る
  • ベストアンサー

PHPとMysqlを使用した集計表の作り方

--------------媒体-------------- CREATE TABLE IF NOT EXISTS `media` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; INSERT INTO `media` (`id`, `name`) VALUES (1, 'yahoo'), (2, '楽天'), (3, '電話'), (4, 'メール'), (5, 'その他'); --------------店舗-------------- CREATE TABLE IF NOT EXISTS `shop` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; INSERT INTO `shop` (`id`, `name`) VALUES (1, '新宿'), (2, '池袋'), (3, '渋谷'), (4, '博多'), (5, '梅田'); --------------来客数-------------- CREATE TABLE IF NOT EXISTS `raikyakusuu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date` date DEFAULT NULL, `shop_id` int(2) DEFAULT NULL, `media_id` int(2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; INSERT INTO `raikyakusuu` (`id`, `date`, `shop_id`, `media_id`) VALUES (1, '2013-11-01', 1, 1), (2, '2013-11-01', 1, 1), (3, '2013-11-01', 1, 2), (4, '2013-11-01', 4, 4), (5, '2013-11-01', 1, 2), (6, '2013-11-02', 3, 1), (8, '2013-11-02', 3, 4), (9, '2013-11-02', 2, 2), (10, '2013-11-02', 2, 4), (11, '2013-11-03', 1, 4), (12, '2013-11-03', 3, 1), (13, '2013-11-05', 4, 3), (14, '2013-11-05', 1, 3), (15, '2013-11-06', 2, 2), (16, '2013-11-06', 3, 3), (17, '2013-11-06', 1, 5); select DATE_FORMAT(r.`date`,'%d日') as DayTime, count(*) as cnt, s.`name` as s_name, m.`name` as m_name from raikyakusuu r LEFT JOIN shop s ON s.`id` = r.`shop_id` LEFT JOIN media m ON m.`id` = r.`media_id` WHERE DATE_FORMAT(r.`date`, '%Y-%m') = '2013-11' GROUP BY DayTime, m.`name` 上記のセレクト文で取れた結果をPHPにて 新宿 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楽天 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | メール | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 池袋 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楽天 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | メール | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 渋谷 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 楽天 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | メール | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | といったようにtableにて表示を考えておりますが、 うまくだせずに困っております。 条件といたしましては、 結果で取れていない媒体、日付も表示させ、cntには0と表示させたいです。 お分かりの方がいらっしゃいましたらご教示お願いいたします。 端折らせていただいている部分も御座いますが、宜しくお願いいたします。

  • PHP
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.3

>$d1 = $row['D1']; >$d2 = $row['D2']; のように扱うと面倒です。「配列のまま」扱うべきです。 (例) <?php $pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", 'root', ''); // SQL文の準備(年月によって日付・列数が変わる) $sql = "select media.name as m_name, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-01' then 1 else 0 end) as D01, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-02' then 1 else 0 end) as D02, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-03' then 1 else 0 end) as D03, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-04' then 1 else 0 end) as D04, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-05' then 1 else 0 end) as D05, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-06' then 1 else 0 end) as D06, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-07' then 1 else 0 end) as D07, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-08' then 1 else 0 end) as D08, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-09' then 1 else 0 end) as D09, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-10' then 1 else 0 end) as D10, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-11' then 1 else 0 end) as D11, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-12' then 1 else 0 end) as D12, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-13' then 1 else 0 end) as D13, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-14' then 1 else 0 end) as D14, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-15' then 1 else 0 end) as D15, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-16' then 1 else 0 end) as D16, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-17' then 1 else 0 end) as D17, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-18' then 1 else 0 end) as D18, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-19' then 1 else 0 end) as D19, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-20' then 1 else 0 end) as D20, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-21' then 1 else 0 end) as D21, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-22' then 1 else 0 end) as D22, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-23' then 1 else 0 end) as D23, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-24' then 1 else 0 end) as D24, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-25' then 1 else 0 end) as D25, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-26' then 1 else 0 end) as D26, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-27' then 1 else 0 end) as D27, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-28' then 1 else 0 end) as D28, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-29' then 1 else 0 end) as D29, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-30' then 1 else 0 end) as D30 from media left join raikyakusuu on media.id = raikyakusuu.media_id where raikyakusuu.shop_id = ? group by media.name"; $st1 = $pdo->query('select * from shop order by id'); // 店舗名を取得するSQL実行 $st2 = $pdo->prepare($sql); // データ取得の準備 while ($row = $st1->fetch(PDO::FETCH_ASSOC)) { print $row['name'] . '<br>'; // 店舗名 $st2->execute(array($row['id'])); // 店舗IDでデータ取得 $sw = 0; while ($item = $st2->fetch(PDO::FETCH_ASSOC)) { if ($sw++ === 0) { // ヘッダ出力 print implode(',', array_keys($item)) . '<br>'; } // 明細出力 print implode(',', $item) . '<br>'; } print '<hr>'; }

h19850323
質問者

お礼

お忙しい中有難う御座います。 上記の内容にてできました。 本当に有難う御座います。

その他の回答 (2)

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

ANo.1です ANo.1で提示したSQL文だと、raikyakusuuデータが(当該年月以外でいいので)存在しないといけませんね(デバッグ中にデータを弄りすぎてしまった)。

h19850323
質問者

お礼

申し訳ありません。 PHPでループをしながら、質問に記載のある 新宿 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楽天 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | メール | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 池袋 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楽天 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | メール | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 渋谷 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 楽天 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | メール | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | のように出したいのですが、それもうまくいかないため、こちらも併せてご教示いただけないでしょうか。 大変申し訳ありませんが、宜しくお願いいたします。

h19850323
質問者

補足

有難う御座います。 ご教示いただいきました、SQL文にて意図している内容が取れました。 ただこの場合ですと、 sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-01' then 1 else 0 end) as D01, の部分は月ごとに変更は可能かと思うのですが、 結果をwhileで回した場合、 while($row = $query) { $d1 = $row['D1']; $d2 = $row['D2']; ・ ・ ・ } 月ごとに末日をとることが難しくないでしょうか。 11月は30日まで$row['D30']; 12月は31日まで$row['D31'];

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>結果で取れていない媒体、日付も表示させ、cntには0と表示させたいです。 この条件があるので、 select shop.name as s_name, media.name as m_name, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-01' then 1 else 0 end) as D01, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-02' then 1 else 0 end) as D02, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-03' then 1 else 0 end) as D03, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-04' then 1 else 0 end) as D04, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-05' then 1 else 0 end) as D05, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-06' then 1 else 0 end) as D06, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-07' then 1 else 0 end) as D07, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-08' then 1 else 0 end) as D08, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-09' then 1 else 0 end) as D09, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-10' then 1 else 0 end) as D10, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-11' then 1 else 0 end) as D11, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-12' then 1 else 0 end) as D12, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-13' then 1 else 0 end) as D13, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-14' then 1 else 0 end) as D14, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-15' then 1 else 0 end) as D15, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-16' then 1 else 0 end) as D16, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-17' then 1 else 0 end) as D17, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-18' then 1 else 0 end) as D18, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-19' then 1 else 0 end) as D19, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-20' then 1 else 0 end) as D20, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-21' then 1 else 0 end) as D21, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-22' then 1 else 0 end) as D22, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-23' then 1 else 0 end) as D23, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-24' then 1 else 0 end) as D24, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-25' then 1 else 0 end) as D25, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-26' then 1 else 0 end) as D26, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-27' then 1 else 0 end) as D27, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-28' then 1 else 0 end) as D28, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-29' then 1 else 0 end) as D29, sum(case DATE_FORMAT(raikyakusuu.date,'%Y-%m-%d') when '2013-11-30' then 1 else 0 end) as D30 from raikyakusuu right join shop on raikyakusuu.shop_id = shop.id right join media on raikyakusuu.media_id = media.id group by shop.name, media.name order by shop.id, media.id のように書くしかありません。phpで動的に生成するのであれば1日から月末日までを取得するのは難しくないと思います。

関連するQ&A

  • 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のインデックスについて質問です。

    mysqlのインデックスについて質問です。 http://archiva.jp/web/server-side/sql_02.html に、 『mysqlでは1つのクエリ実行で、1つのテーブルにつき1つのインデックスしか使用できない』 とあります。 よく以下のようなテーブル定義を見かけますが、 CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; idとuser_idを条件にするクエリであれば、上記制約を満たすため、 KEY `id_user_id_idx` (`id`,`user_id`) の複合クエリを定義すれば良いのでしょうか? また、idとuser_idとfile_idを条件にするクエリも考慮に入れた場合、 テーブル定義は以下のようにするのでしょうか? CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `id_user_id_idx` (`id`,`user_id`), KEY `id_user_id_file_id_idx` (`id`,`user_id`,`file_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 最後に、create table 時のインデックスの指定は、 INDEX `user_id` (`user_id`), のようにもできますが、INDEXとKEYの違いは何かあるのでしょうか。

    • ベストアンサー
    • MySQL
  • MySQL SELECTの指定について

    まず、御覧頂きありがとうございます。 早速質問なのですが、 CREATE TABLE `hoge` ( `id` int(8) NOT NULL, `name` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `hoge` (`id`, `name`) VALUES (1, 'hogeA'), (2, 'hogeB'), (3, 'hogeC'), (4, 'hogeD'); CREATE TABLE `test` ( `id` int(8) NOT NULL, `name` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test` (`id`, `name`) VALUES (1, 'testA'), (4, 'testD'); という値が入ってるテーブルがあるとします。(長くなってすみません) で、 hoge.id と test.id が重複した場合 test.name を表示させたいです。 期待値としては id,name 1.testA 2,hogeB 3,hogeC 4,testD になります。 業務でJoinを使うようなテーブル構造にそもそもしないというのもあり、クリティカルなSQLコードに不慣れで御知恵を借りたく質問させて頂きました。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • create時にFOREIGN KEYでエラー

    以下のSQL文を実行すると CREATE TABLE if not exists table_A ( id int(11) not null auto_increment, company_id int(11) not null, created_at datetime NOT NULL, updated_at timestamp NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; CREATE TABLE if not exists table_B ( id int(11) not null auto_increment, from_id int(11) not null, company_id int(11) not null, created_at datetime NOT NULL, updated_at timestamp NOT NULL, PRIMARY KEY (id) FOREIGN KEY (from_id) REFERENCES table_A(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 上記を実行すると以下のエラーがでます。 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOREIGN KEY (from_id) REFERENCES table_A(id) ON DELETE CASCADE ) ENGINE=Inn' at line 8 解決方法をご存知の方はご教示頂けますと幸いです。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLのテーブル設計で迷っています(桁数)

    MySQLのテーブル設計で迷っています。 クリエイト文のカッコの中は桁数を表しているのでしょうか?それともバイト数でしょうか?桁数であれば、それぞれの型で何桁まで設定できますでしょうか? int型のnoを18桁に変更したいのですが、調べているうちに迷ってしまいました。 型 バイト 最小値 最大値 TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807 CREATE TABLE `user` ( `no` int(8) unsigned NOT NULL auto_increment, `id` varchar(24) NOT NULL default '', `email` varchar(255) NOT NULL default '', `reg_date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`no`) ) TYPE=MyISAM;

    • ベストアンサー
    • MySQL
  • MySQL5.1.14で空白を入れるとエラーになる

    MySQL5.1.14をインストールをしたところ、4.1で動いていたプログラムが軒並みエラーストップ。 どうも、空白を入れるとエラーになるようで、5.1へ移行出来なくて困っています。どなたかご教授をお願いします。 環境は Windows2000Pro MySQL 5.1.14-beta サンプルのテーブルは drop table if exists addressbook; CREATE TABLE addressbook( id smallint(4) UNSIGNED NOT NULL auto_increment, name1 varchar(20) default NULL, birthday date default NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=sjis; INSERT INTO addressbook VALUES ('','名前1','2006-12-22'), ('','',''); で次のエラーが出る。 ERROR 1366 (HY000): Incorrect integer value: '' for column 'id' at row 1

    • ベストアンサー
    • MySQL
  • 表の結合と並べ替え

    次のようなテーブル構成で、 CREATE TABLE tbl1 ( id int PRIMARY KEY AUTO_INCREMENT ) ENGINE=InnoDB; CREATE TABLE tbl2 ( id int PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) ) ENGINE=InnoDB; CREATE TABLE tbl1_tbl2 ( id int PRIMARY KEY AUTO_INCREMENT, tbl1_id int, tbl2_id int, FOREIGN KEY(tbl1_id) REFERENCES tbl1(id), FOREIGN KEY(tbl2_id) REFERENCES tbl2(id) ) ENGINE=InnoDB; CREATE TABLE tbl3 ( id INT PRIMARY KEY AUTO_INCREMENT, tbl1_id int, created datetime, FOREIGN KEY(tbl1_id) REFERENCES tbl1(id) ) ENGINE=InnoDB; [tbl1] id 1 2 3 [tbl2] id  name 1   a 2   b [tbl1_tbl2] id  tbl1_id  tbl2_id 1   1      1 2   1      2 3   1      2 4   2      1 5   3      1 6   3      2 [tbl3] id  tbl1_id  created 1   1    2011-10-17 01:51:39 2   1    2011-10-17 02:51:39 3   3    2000-10-17 01:51:39 ここから次のような「tbl1のid」「tbl2の個数」「tbl3の最新のcreated」を基準とした (下の例は「tbl1のid」を昇順にした結果です) それぞれの並べ替た結果を得たいのですが、どのようなSQL文を記述すれば良いのでしょうか? [tbl1のid] [tbl2のnameのリスト] [tbl3の最新のcreated]   1         a,b,b      2011-10-17 02:51:39   2         a           3         a,b       2000-10-17 01:51:39

    • ベストアンサー
    • 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 ・・・について意味がわかりません。 基本的すぎる事なのか参考書に説明がありませんでした^^; 詳しい方おりましたらわかりやすく教えて頂けますと幸いです。 宜しくお願い致します。

  • phpでnot null、a_iでテーブル作成

    PHPで、以下のようなソースで、存在しているデータベースtestに接続し、もしない場合、name_listというテーブルを作り、1カラム目をカラム名がnoで、int型でnot null auto_incrementにして、2カラム目をカラム名がnameで、not nullで作りたいのですが、うまくテーブルが作られません。 どうすればうまく作られるか教えてください。 <?php try{ $pdo = new PDO('mysql:dbname=test; host=localhost; charset=utf8', 'root'); $st = $pdo->prepare("create table if not exists name_list (no int(100) not null auto_increment, name varchar(100) not null);"); $st->execute(); }catch(PDOException $e){ print('Error:'.$e->getMessage()); die(); }

    • ベストアンサー
    • MySQL
  • mySQLでのテーブル作成についての質問

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

専門家に質問してみよう