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

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

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

  • 回答数4
  • 閲覧数423
  • ありがとう数1

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

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

あ、ごめんなさいindexではなくunique ALTER TABLE `student_upload` ADD UNIQUE (`student_number`,`upload_id`); ちなみにDISTINCTでデータが重複するはずがないので おそらく根本的なところでなにか勘違いしていると思います。 データの取り出しはなにをつかっていますか? プログラム処理をして単に処理を二回しているような気がするのですが・・・

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

質問者からの補足

yambejpさん、度々ご回答ありがとうございます。 student_numberとupload_idでユニークにしないと無理でしょうか。 できれば、ユニークキーにはしないで処理を完結させたいと思っております。 ご教示いただいた通りのSQL文をphpMyAdminから実行しております。 なので、プログラムのせいなどではないと思うのですが。 テーブルの構造を見直さないと無理なのでしょうか。

関連するQ&A

  • 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
  • 存在しないレコードの抽出方法について

    table_aに存在するidのうち、table_bには存在しないidを抽出するSLQ文を作成したいと思ったのですが、抽出方法が分からなかったので、アドバイスいただける方がいらっしゃいましたら、ご教示いただけたらと思います。 下記の例では、table_aには、101~106までのidがあるのに対し、table_bには101,102,104のidがあるため、103,105,106を抽出したいと思います。 CREATE TABLE IF NOT EXISTS `table_a` ( `auto_id` int(11) NOT NULL, `id` varchar(7) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `table_a` (`auto_id`, `id`) VALUES (1, '101'), (2, '102'), (3, '103'), (4, '104'), (5, '105'), (6, '106'); CREATE TABLE IF NOT EXISTS `table_b` ( `auto_id` int(11) NOT NULL, `id` varchar(7) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `table_b` (`auto_id`, `id`) VALUES (1, '101'), (2, '102'), (3, '102'), (4, '102'), (5, '104'), (6, '104'); 以上、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 複数のテーブルに対し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文を書けば良いか分からなかった為、 アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。

    • ベストアンサー
    • PHP

その他の回答 (3)

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

#2さんの補足を拝見しましたが、本当にダブリデータがあるのでしたら ダブリを可能にしておく意味がないので ALTER TABLE `student_upload` ADD INDEX (`student_number`,`upload_id`); でユニークを担保すればいいのでは? (すでにダブリデータがある場合は整合性があわないのでエラーになります。 ダブリデータを削除してから実行してください) 別視点で、とりあえず動けばいいやという姑息な判断をするなら DISTINCTするだけでもなんとかなります。 select DISTINCT * from students s, student_upload up where up.upload_id=1 and up.student_number=s.student_number なおデバッグ中はともかくきちんとした運用をするときにはワイルドカード(*)は使わないでください。

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

質問者からの補足

yambejpさん、ご回答ありがとうございます。 説明が不足しており、申し訳ございません。 indexはすでに作成済みであります。 また、distinctを追加しても重複したデータで取得されてしまいます。 students にはユニークがありますので、student_upload はダブりデータOKで進めたいと考えております。 恐縮ですが、よろしくお願いいたします。

  • 回答No.2

提示された情報、格納済みデータ、あるいはSQLに、誤りがあるように感じます。 student_uploadは重複データも格納できてしまうので、まったく同じデータを格納してしまっているのでは? その結果、upload_id=2のデータが検索されているのではなく、upload_id=1のデータが増えてしまっているように見えます。

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

質問者からの補足

chukenkenkouさん、ご回答ありがとうございます。 student_upload はstudent_number の重複登録可能としております。 SQL文をどのように変更したらよろしいでしょうか。 よろしくお願いいたします。

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

とくに問題ないようにみえますが こんな感じになりますよね? id |student_number |name |student_number |upload_id 1 |11111 |いちろう |11111 |1 2 |22222 |じろう |22222 |1

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

質問者からの補足

yambejpさん、ご回答ありがとうございます。 ご提示いただいた通りに取得したいのですが student_upload に4件登録されていたら、4件取得されてしまいます。 ---------- id |student_number |name |student_number |upload_id 1 |11111 |いちろう |11111 |1 2 |22222 |じろう |22222 |1 1 |11111 |いちろう |11111 |1 2 |22222 |じろう |22222 |1 ---------- upload_id=2 にも関わらず、1に上書き?されて取得されてしまうのです。 よろしくご教示お願いいたします。

関連するQ&A

  • 外部キーを持つテーブルを作成しようとするとエラーがでます

    XAMPPバージョン1.5.4 MySQLバージョン4.1.16 という環境で、my.cnfでInnoDBを使えるように設定しています。 そして CREATE TABLE admin_roles (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(12) NOT NULL) ENGINE = InnoDB; という非参照列idを持つadmin_rolesテーブルを作り(成功し)、さらに role_idを外部キーとしてadmin_user_roleテーブルを作成しようとすると、 Error Number: 1005 Can't create table '.\test\admin_user_role.frm' (errno: 150) CREATE TABLE admin_user_role (userid VARCHAR(12) NOT NULL, role_id BIGINT DEFAULT 0, FOREIGN KEY (role_id) REFERENCES admin_roles(id) ON DELETE CASCADE) ENGINE = InnoDB; というエラーが出てしまいます・・・ admin_user_roleの記述のどこが間違っているのでしょうか?

    • ベストアンサー
    • MySQL
  • 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
  • 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
  • Oracleのシーケンスありのテーブル作成について

    Oracleのテーブルを作るのに、ある列を自動で「全体の通し番号」みたいなユニーク(一意)な番号を振りたいく、 シーケンス(sequence)を作成しテーブルを作ろうとしているのですがうまくいきません。 どこがわるいのでしょうか。 create sequence "yamaaf_seq"; CREATE TABLE TBL_AFFILIATE_SESS( UNIQ_ID NUMBER(11,0) DEFAULT nextval('yamaaf_seq') NOT NULL, ORG_CODE VARCHAR2(64) NOT NULL, primary key("UNIQ_ID"));

  • 時間を自動計算してディフォルトに設定

    以下のようなテーブルを作りたいと思うのですが、 CREATE TABLE hogeTBL ( id bigint(20) NOT NULL AUTO_INCREMENT, product_code varchar(20) NOT NULL default, start_time datetime NOT NULL default '0000-00-00 00:00:00', end_time datetime NOT NULL default '0000-00-00 00:00:00', sub_time datetime NOT NULL default(ここにend_time-start_timeの値を設定したい), PRIMARY KEY (id) ) TYPE=MyISAM; 見たとおり、インサート時、sub_timeのところに自動で end_time - start_time の、差分値が挿入されるようにしたいのですが、構文が思いつきません。 そもそもこういったことはCreate Tableで可能なのでしょうか・・・? サーババージョンは4.1.22です。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • SQL文を入力したらエラー

     phpMyAdminでSQLに  以下の文を入力しました。  CREATE DATABASE xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default ' ' , org varchar(50) not null default ' ', addr varchar(80) not null default' ', tel varchar(20) default ' ', mail varchar(40) default ' ', course varchar(30) default ' ', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;  以上SQLに入力した文ですが!  以下のエラーが出て先に進みません。   エラー 実行した SQL: CREATE DATABASE xmas; → (http://dev.mysql.com/doc/refman/5.5/en/create-database.htmlにリンクされている) MySQL のメッセージ: ドキュメント #1007 - Can't create database 'xmas'; database exists サーバ "127.0.0.1" 上でクエリを実行する: CREATE DATABASE xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default ' ' , org varchar(50) not null default ' ', addr varchar(80) not null default' ', tel varchar(20) default ' ', mail varchar(40) default ' ', course varchar(30) default ' ', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;   以上ですが、何が原因で進めないか原因を追及中です。  最近SQLを始めたので、全く見当がつきません。 皆様よろしくお願いします。  

    • ベストアンサー
    • MySQL
  • 最新の1行のみを取得する。

    個人テーブル、身長テーブル、体重テーブルという3つのテーブルがあり、それぞれ以下の通りの構造となっています。 CREATE TABLE T個人 (  番号 NUMBER(4,0) NOT NULL,  名前 VARCHAR(20) NOT NULL, ); CREATE TABLE 身長 (  番号 NUMBER(4,0) NOT NULL,  更新 NUMBER(4,0) NOT NULL,  身長 NUMBER(4,0) NOT NULL, ); CREATE TABLE 体重 (  番号 NUMBER(4,0) NOT NULL,  更新 NUMBER(4,0) NOT NULL,  体重 NUMBER(4,0) NOT NULL, ); これら3つのテーブルを用いて以下のようなViewを作りたいのですが… 番号,名前,身長,体重 身長及び体重テーブルに「更新」というフィールドがあり、同じ番号の場合、上書きではなく更新番号を増やしています。 番号,更新,身長 -------------- 0001,0001,0155 0001,0002,0157 0002,0001,0163 0002,0002,0162 最新の情報のみを引っ張るSQL文はどのように記述すれば良いのでしょうか。 番号,名前,身長,体重 ------------------- 0001,NAME,0157,0038 0002,NAME,0162,0044

  • MySQL Date型にNULLが設定できない。

    csvファイルからMySQLにデータを取り込む際に、Date型やint型にNULLを設定するにはどうしたらよいでしょうか。 以下のようなテーブルに | tTest | CREATE TABLE `ttest` ( `ID` bigint(20) NOT NULL, `title` text NOT NULL, `naiyou` varchar(100) DEFAULT NULL, `kaishi` date DEFAULT NULL, `owari` date DEFAULT NULL, `peirod` bigint(20) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=sjis | 以下のようなcsvファイルを読み込んだとき(*)、 10,テスト,2008-04-05,2009-04-23,43 11,テスト,2008-04-05,NULL,43 12,テスト,2008-04-05,2009-04-23,NULL 2行目のNULLで ERROR 1292 (22007): Incorrect date value: 'NULL' for column .... とエラーが発生します。 3行目のNULLでもint型ですが同様にエラーとなります。 一方、insertで行の追加以下のようにした場合は成功します。 insert into tTest values (12,テスト,'2008-04-05',NULL,NULL) 外部ファイルから読み込んだ場合にNULL値を設定するにはどのようにしたらよいのでしょうか。 (*)以下のコマンド LOAD DATA INFILE "E:\\work\\MySQL\\sample.csv" INTO TABLE tTest FIELDS TERMINATED BY "," LINES TERMINATED BY "\r\n";

    • ベストアンサー
    • MySQL
  • SQLにプログラムが反映されないのは何故

    XAMPP Version: 1.8.2 です。   Xamsのデータベースをデータベースから削除した後  SQLから、以下2個プログラムを入力しました。  すると、削除したにも関わらず、エラーが出て プログラムが反映されません。  Xamsを削除後、再起動したらまたXamsのデータベースが 再構築されます。  私は作成した記憶はありません。  すでに存在しているので、作成しする必要は ないのか、よくわかりません!?  皆様どう思われますか!?  以下入力したプログラムです。 ---------------------------------------------------------------- CREATE DATABASE xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default '' , org varchar(50) not null default '', addr varchar(80) not null default'', tel varchar(20) default '', mail varchar(40) default '', course varchar(30) default '', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; エラー 実行したSQL: DATABASEクリスマスを作成します。 のMySQLのメッセージ:ドキュメント #1007 - データベース'クリスマス'を作成できません、データベースが存在している -------------------------------------------------- CREATE DATABASE if not exists xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default '' , org varchar(50) not null default '', addr varchar(80) not null default'', tel varchar(20) default '', mail varchar(40) default '', course varchar(30) default '', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; エラー 実行したSQL: TABLE xmastranを(CREATE book_idのINT NOT NULL AUTO_INCREMENT、 名VARCHAR(30)NOT NULL DEFAULT''を、 orgのVARCHAR(50)NOT NULL DEFAULT''を、 addrはVARCHAR(80)NOT NULL DEFAULT''を、 電話VARCHAR(20)DEFAULT''を、 メールVARCHAR(40)DEFAULT''を、 もちろんVARCHAR(30)DEFAULT''を、 numsはINTEGERのデフォルトは0、 PRIMARY KEY(book_id) )ENGINE = MYISAM DEFAULT CHARSET= utf8を; のMySQLのメッセージ:ドキュメント #1050 - テーブル 'xmastran'は既に存在します。 ------------------------------------------------------------------- 以上よろしくお願いします。

    • ベストアンサー
    • MySQL