- ベストアンサー
3つのテーブルから情報一覧を作成する方法
- MySQL4.0.22の制約でサブクエリが使用できないため、3つのテーブルから情報を一覧で表示する方法を教えてください。
- テーブル構造は「name」「sousyoku」「soubi」の3つで、それぞれの情報を結合して出力したいです。
- 装備登録テーブルには装備の番号があり、髪型や顔型などの詳細情報は専用のテーブルに格納されています。番号で表示できればと考えています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
関連するQ&A
- 左辺外部結合について教えて下さい
いつもお世話になっております。 存在しないカラムをNULLで表示させて、主キーで グループ化したいのです。 どうか、ご指導よろしくお願い申し上げます。 【使用環境】 MySQL4.0.22 PHP4.3.11 【テーブル構造】 mysql> select * from soubi; +--------+------+---------+--------+ | soukey | nkey | jyankey | jyanno | +--------+------+---------+--------+ | 1 | 1 | 1 | 10 | | 2 | 1 | 2 | 3 | 略 上記テーブルを、下記↓にしたいのです。 +------+------+------+------+------+------+------+------+ | nkey | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +------+------+------+------+------+------+------+------+ | 1 | 10 | 3 | 2 | 8 | NULL | NULL | NULL | | 2 | 10 | 8 | 7 | 8 | 10 | 1 | NULL | | 4 | 10 | 10 | 8 | 7 | 8 | 1 | NULL | +------+------+------+------+------+------+------+------+ こちらの質問の過去ログを参考に、現在試したクエリと 結果は下記です。 select nkey, case when jyankey = 1 then sum(jyanno) else null end '1', case --略-- when jyankey = 7 then sum(jyanno) else null end '7' from soubi group by jyankey,nkey order by nkey ; +------+------+------+------+------+------+------+------+ | nkey | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +------+------+------+------+------+------+------+------+ | 1 | NULL | NULL | NULL | 8 | NULL | NULL | NULL | | 2 | NULL | NULL | NULL | 8 | NULL | NULL | NULL | | 4 | NULL | NULL | NULL | NULL | 8 | NULL | NULL | | 4 | NULL | 10 | NULL | NULL | NULL | NULL | NULL | 略
- ベストアンサー
- MySQL
- 複数テーブルの集計
お世話になっています。 複数テーブルの集計がわからないので質問させてください。 テーブル3のItem1~4にはテーブル2のItemIDを登録します。 エリア毎の参加人数をcsvデータを出力させたいです。 テーブル3においてテーブル2のItemIDが4つあるので、一人に対して4行必要なのかと思いましたが、テーブルの変更ができません。 テーブルの結合まではできましたがその後ができません。 テーブルの変更ができませんので、結合するためにテーブル2の構造とデータが同じテーブルを他に3つ作成しています。 どうぞよろしくお願いします。 テーブル1 AreaID AreaName --------------------- 1 北海道 2 東北 3 関東 4 北陸 テーブル2 ItemID ItemName --------------------- 1 自由形50 2 自由形100 3 背泳ぎ50 4 平泳ぎ50 テーブル3 ID AreaID Name Item1 Item2 Item3 Item4 --------------------------------------------------------- 1 2 鈴木 2 1 4 3 2 3 佐藤 1 null 3 null 3 1 田中 1 2 null null 4 2 伊藤 3 null 2 4 5 3 川村 null 2 3 null 「集計結果」 参加人数 自由形50 自由形100 背泳ぎ50 平泳ぎ50 --------------------------------------------------------------- 北海道 1 1 1 0 0 東北 2 1 2 2 2 関東 2 1 1 2 0 北陸 0 0 0 0 0
- ベストアンサー
- MySQL
- MySQLでのテーブル作成
MySQLでこういったテーブルを作成したのですが、 CREATE TABLE NOSGI ( GNRE_CD CHAR(5) NOT NULL, GNRE_NAME VARCHAR(20) NOT NULL, PRIMARY KEY (GNRE_CD) ); GNRE_CDはCHAR型で作成したのに、カラムの情報を見ると、 VARCHAR型にしまうのですが、どうしてでしょうか?
- ベストアンサー
- その他(データベース)
- 2つのテーブルにあるIDを1つのID(item_id)?にしたいです。
2つのテーブルにあるIDを1つのID(item_id)?にしたいです。 このやり方は間違ってますか? ご指摘よろしくお願いします。 車テーブル car_id name maker price 1 スープラ トヨタ 100 2 スカイライン 日産 100 食べ物テーブル food_id name price 1 リンゴ 100 2 バナナ 100 アイテムテーブル item_id car_id(外) food_id(外) 1 1 NULL 2 2 NULL 3 NULL 1 4 NULL 2
- 締切済み
- MySQL
- sqlservrのシステムテーブルから主キー判定
sqlservrのシステムテーブルのから主キーの判定を行いたいです。 sysobjects(type='U')でテーブル情報があり、それに紐付くsyscolumnsの項目情報があるとします。 テーブル名,項目名 tbl1,item1 tbl1,item2 tbl1,item3 tbl2,item1 tbl2,item2 これは、 select obj.name as "テーブル名" , col.name as "項目名" from sysobjects obj left join syscolumns col on obj.id = col.id where obj.type = 'U' で取得できますが、 さらに、主キーの項目には○をつけたいです。 テーブル名,項目名,主キー tbl1,item1,○ tbl1,item2,○ tbl1,item3,null tbl2,item1,○ tbl2,item2,null sysindexkeysやsysindexesの情報を引っ掛ければなんとかなるかと思いましたが、何ともならずにGive UP状態です。 システムテーブルを結合して取得する方法はありますでしょうか?
- ベストアンサー
- SQL Server
- MySQLでCREATE TABLE
MySQLでCREATE TABLEをする際に、 プライマリキーを設定する場合は、 CREATE TABLE( AAA CHAR(5) NOT NULL, BBB CHAR(5) NOT NULL, CCC VARCHAR(10) NOT NULL, PRIMARY KEY(AAA) ); のようにすると思うのですが、「BBB」を外部キーにしたい場合は、どうしたらいいのでしょうか?
- 締切済み
- その他(データベース)
- 階層構造のテーブルの行の取得について
このジャンルでお願いします。 次のようなテーブルで CREATE TABLE IF NOT EXISTS user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user (name) VALUES ('user1'); INSERT INTO user (name) VALUES ('user2'); INSERT INTO user (name) VALUES ('user3'); CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, parent_id INT, name varchar(32) NOT NULL, FOREIGN KEY (parent_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7'); INSERT INTO item (parent_id, name) VALUES (null, 'item8'); CREATE TABLE IF NOT EXISTS user_item ( id int(11) NOT NULL AUTO_INCREMENT, user_id INT, item_id INT, type varchar(16) NOT NULL, PRIMARY KEY(id), FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (item_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user_item (user_id, item_id, type) VALUES (1, 1, 'allow'); INSERT INTO user_item (user_id, item_id, type) VALUES (1, 3, 'deny'); INSERT INTO user_item (user_id, item_id, type) VALUES (1, 7, 'allow'); user_itemのuser_idが1のitemの行を取得したいのですが、 その条件として ・user_itemテーブルのtypeが'allow'のitem_id以下のitemの行 ・ただしtypeが'deny'のitem_id以下の行は除く この例だと、user_itemの INSERT INTO user_item (user_id, item_id, type) VALUES (1, 1, 'allow'); の行によってitemテーブルの INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); が取得候補になりますが、 INSERT INTO user_item (user_id, item_id, type) VALUES (1, 3, 'deny'); によって INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); の行は除かれ、 INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); の行が取得されます。 つまりitemテーブルにおいて上の階層の直近の(user_itemと結合して取得した)typeが 'allow'である場合のみ取得したいのです。 INSERT INTO item (parent_id, name) VALUES (null, 'item1');←取得 INSERT INTO item (parent_id, name) VALUES (1, 'item2');←取得 INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5');←取得 INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7');←取得 INSERT INTO item (parent_id, name) VALUES (null, 'item8'); 複雑ではありますが、これはどのようなSQL文にすれば良いのでしょうか?
- ベストアンサー
- MySQL
- データがない場合のクエリの書き方
いつもお世話になっております。 MySQLとPHPで開発をしております。 以下のような3つのテーブルがあります。 テーブル:Hp(キー:hid) |hid |name |・・・| +---------------------+ |1 |a_name|・・・| |2 |b_name|・・・| テーブル:items(キー:item_id) |item_id|item|alias|type|・・・| +----------------------------------+ |1 |aa |aaaaa|11 |・・・| |2 |bb |bbbbb|11 |・・・| |3 |cc |ccccc|11 |・・・| |4 |dd |ddddd|22 |・・・| |5 |ee |eeeee|22 |・・・| テーブル:check(キー:hid, item_id ) |hid|item_id|・・・| +-------------------+ |1 |1 |・・・| |1 |2 |・・・| |1 |3 |・・・| |2 |1 |・・・| |2 |3 |・・・| |2 |5 |・・・| check に登録されていない item_id を表示したいと考えているのですが データの取得方法がわかりません。 例えば hid=1 の場合、item_id=4 と item_id=5 を取得したいです。 下記クエリの場合、hid に関係なく取得できてしまいます。 select i.* from items i left join check c using(item_id) where i.type='11' and c.item_id is NULL order by i.item_id ASC どうやってクエリを書いたらよろしいでしょうか。 ご教示お願いいたします。 <環境> MySQL:4.1.20
- ベストアンサー
- PHP
- テーブルの最後のレコードしか表示されない
すごく初歩的な質問だと思い申し訳ないのですがご教授下さい。 タイトル通り、テーブルの最後のレコードしか表示されないのです。 この前までは全て表示できていたのですが、 どこをどういじったのか、このようなことになってしまいました。 itemというテーブルには53個登録があり、53番目のものしか表示されません… $sql = "select * from item order by id"; $rst = mysql_query($sql, $con); while($col = mysql_fetch_array($rst)) { $dbt = "<tr bgcolor='#FFFFFF'> <td align='center'><a href='use.php?key=".$col["name"]."'>".$col["name"]."</a></td> <td align='center'>".$col["name1"]."</td> <td align='center'>".$col["name2"]."</td> <td align='center'>".$col["name3"]."</td> <td align='center'>".$col["name4"]."</td> <td>".nl2br($col["name5"])."</td> <td align='center'>".$col["name6"]."</td> </tr>"; } mysql_free_result($rst); $con = mysql_close($con); それと、もう一つ解決したいことがあるのですが、 <a href='use.php?key=".$col["name"]."'>".$col["name"]."</a> のようにアンカーを張り、次のページに変数を渡す方法で、use.php?key=*****のように、表示させないことは可能でしょうか? 見た目にも悪いですし、セキュリティ上も好ましくないかと思いまして方法があればと思いました。
- ベストアンサー
- MySQL
- 3つの関連するテーブルから必要な情報を取り出す
現在、データベースで小規模の検索システムを製作しているのですが、詰まってしまったところがあるので、質問をさせて頂きたいです。 まず、最初に取り出したいテーブルの構成を書きたいと思います。 "Tag" "Works" "EquipTag" の三つのテーブルがあり、 Tag /* Tagをあらわすテーブル*/ id: primaryキー name: 名前 created_at: 作成日 Works /* 作品を表すテーブル*/ id: primary キー name: 名前 created_at: 作成日 Equip_Tag /*作品とタグの関連を保存するテーブル*/ id: primaryキー works_id: 外部キー Worksのprimaryキーに対して tag_id: 外部キー Tagのprimaryキーに対して となっています。 上記のテーブルから、 「タグの名前に '%hoge%'を持ち、かつ、作品の名前に'%hogehoge%'を含む作品一覧」を取得したいのですが、どういった方法が考えられるでしょうか? また、Worksのidが同じものは2度表示しないようにしたいと考えています。 使用しているDBは、MySQL のバージョン5です。 どうか宜しくお願いします。
- ベストアンサー
- MySQL
お礼
naktak様。こんにちは。 ご指導ありがとうございました。 >どこを指しているのかわかりません。 すみません。最初に記述した投降のテーブル内容に 記述ミスをしておりました。 テーブル構造を書き直しました。 【テーブル構造】 mysql> select * from name; +------+------+------+------+------------+--------+------+ | nkey | name | age | sei | tou | fuken | kahi | +------+------+------+------+------------+--------+------+ | 1 | 田中 | 17 | 2 | 2005/12/25 | 大阪府 | 可 | | 2 | 佐藤 | 20 | 1 | 2006/02/25 | 京都府 | 可 | | 3 | 鈴木 | 25 | 2 | 2006/04/25 | 北海道 | 可 | | 4 | 山田 | 30 | 1 | 2006/03/25 | 東京都 | 可 | | 5 | 阿部 | 19 | 2 | 2005/11/25 | 大阪府 | 可 | +------+------+------+------+------------+--------+------+ 5 rows in set (0.00 sec) mysql> select * from jyan; +---------+----------+ | jyankey | jyanname | +---------+----------+ | 1 | 顔型 | | 2 | 髪型 | | 3 | 上着 | | 4 | 下着 | | 5 | 靴 | | 6 | アイテム | +---------+----------+ 6 rows in set (0.00 sec) mysql> select * from soubi; +--------+------+---------+--------+ | soukey | nkey | jyankey | jyanno | +--------+------+---------+--------+ | 1 | 1 | 1 | 10 | | 2 | 1 | 2 | 3 | | 3 | 1 | 3 | 2 | | 4 | 1 | 4 | 8 | | 5 | 2 | 1 | 10 | | 6 | 2 | 5 | 10 | | 7 | 2 | 2 | 8 | | 8 | 2 | 3 | 7 | | 9 | 2 | 4 | 8 | | 10 | 2 | 6 | 1 | | 11 | 4 | 1 | 10 | | 12 | 4 | 2 | 10 | | 13 | 4 | 3 | 8 | | 14 | 4 | 4 | 7 | | 15 | 4 | 5 | 8 | | 16 | 4 | 6 | 1 | +--------+------+---------+--------+ 16 rows in set (0.00 sec)
補足
文字数が多いので、途中で切れてしまいました……。 つづきです。 上記テーブルを、PHPからHTMLで吐き出した時に下記の 表にしたいのです。 【出力テーブルイメージ】 名前┃可否┃登録日┃顔型┃髪型┃上着┃下着┃靴┃アイテム -------------------------------------------------- 田中┃可 ┃2006/04/01┃10┃2┃3┃4┃12┃NULL┃NULL┃ ------------------------------------------------- 佐藤┃否 ┃2005/01/12┃NULL┃1┃3┃4┃NULL┃NULL 何度も申し訳ありません。 ご指導よろしくお願い申し上げます。