こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2011-02-17 10:49:43

QNo.6529202

すぐに回答ほしいです

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

あ、ごめんなさいindexではなくunique

ALTER TABLE `student_upload` ADD UNIQUE (`student_number`,`upload_id`);

ちなみにDISTINCTでデータが重複するはずがないので
おそらく根本的なところでなにか勘違いしていると思います。
データの取り出しはなにをつかっていますか?
プログラム処理をして単に処理を二回しているような気がするのですが・・・

投稿日時 - 2011-02-17 16:12:37

補足

yambejpさん、度々ご回答ありがとうございます。

student_numberとupload_idでユニークにしないと無理でしょうか。
できれば、ユニークキーにはしないで処理を完結させたいと思っております。

ご教示いただいた通りのSQL文をphpMyAdminから実行しております。
なので、プログラムのせいなどではないと思うのですが。

テーブルの構造を見直さないと無理なのでしょうか。

投稿日時 - 2011-02-17 18:41:19

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

#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

なおデバッグ中はともかくきちんとした運用をするときにはワイルドカード(*)は使わないでください。

投稿日時 - 2011-02-17 15:21:22

補足

yambejpさん、ご回答ありがとうございます。

説明が不足しており、申し訳ございません。
indexはすでに作成済みであります。

また、distinctを追加しても重複したデータで取得されてしまいます。

students にはユニークがありますので、student_upload はダブりデータOKで進めたいと考えております。

恐縮ですが、よろしくお願いいたします。

投稿日時 - 2011-02-17 16:03:52

ANo.2

提示された情報、格納済みデータ、あるいはSQLに、誤りがあるように感じます。

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

投稿日時 - 2011-02-17 14:15:01

補足

chukenkenkouさん、ご回答ありがとうございます。

student_upload はstudent_number の重複登録可能としております。
SQL文をどのように変更したらよろしいでしょうか。

よろしくお願いいたします。

投稿日時 - 2011-02-17 14:25:50

ANo.1

とくに問題ないようにみえますが
こんな感じになりますよね?

id |student_number |name |student_number |upload_id
1 |11111 |いちろう |11111 |1
2 |22222 |じろう |22222 |1

投稿日時 - 2011-02-17 11:27:26

補足

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に上書き?されて取得されてしまうのです。

よろしくご教示お願いいたします。

投稿日時 - 2011-02-17 11:51:28