人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【ポイント有り】MySQLとPHPの質問です!

3つのテーブルが存在します。(※画像)

全てのテーブルに項目「kumi」が入っており、このkumiで全てのレコード等を紐付けています。
※IDは各テーブルのauto_incrementで付与

行いたい事:
(1)テーブル「type」から項目「name」の中でaichiを検索し、kumiの値が一緒のレコードを取得します。この際、IDが昇順で取得します。
※画像の場合、name=aichiだとkumiは2になり、kumi=2の他のレコードはshinjyoのみ

(2)テーブル「kiroku」の中に(1)で取得した「name」の記録が残っているか確認し、最後の値を確認します。
※画像の場合は「aichi」

(3)(1)と(2)で取得したデータから次記録されるべきデータを抽出します。
※画像の場合:テーブル「type」は「shinjyo」、 テーブル「data」は「辻」

上手く言えないのですが、PHPで表現すると下記のような感じです:
for(type["kumi"]=2){
for(data["kumi"]=2){
$tmp="辻";
}
return array("name"=>"shinjyo","title"=>$tmp);
}


上記を出来ればMYSQL(SQL文)でお願いします。
もしPHP側で処理したほうが速度が早い傾向にあるのであればそちらでも構いません。

1359296244
●拡大する

●質問者: webtomake
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● JULY
●200ポイント ベストアンサー

う?ん、いろいろ良くわからない点があるのですが、

(1)テーブル「type」から項目「name」の中でaichiを検索し、kumiの値が一緒のレコードを取得します。この際、IDが昇順で取得します。
※画像の場合、name=aichiだとkumiは2になり、kumi=2の他のレコードはshinjyoのみ

この時、取得されるレコードは、元々、検索のキーとなる値(この例では aichi)を含まないレコード、ということでしょうか。
単に aichi と同じ kumi の値を持つレコードであれば、

select * from type where kumi in (select kumi from type where name like 'aichi') order by id

で OK ですが、これだと、ID が 2 番と 6 番の2つが抽出されます。もし、ID 6 番のレコード(name が aichi のレコード)は抽出されないようにしたいのであれば、

select * from type where kumi in (select kumi from type where name like 'aichi') and not name like 'aichi' order by id

となります。
問い合わせ結果は、前者の場合であれば、

+------+------+---------+
| id | kumi | name |
+------+------+---------+
| 2 | 2 | shinjyo |
| 6 | 2 | aichi |
+------+------+---------+

後者の方は

+------+------+---------+
| id | kumi | name |
+------+------+---------+
| 2 | 2 | shinjyo |
+------+------+---------+

となります。

(2)テーブル「kiroku」の中に(1)で取得した「name」の記録が残っているか確認し、最後の値を確認します。
※画像の場合は「aichi」

もし、(1)で取得したレコードが、先の例の前者であれば、kiroku から name が「shinjyo」もしくは「aichi」のレコードを探す事になります。これであれば、ID が 9 番のレコードが該当して、そのレコードの name は「aichi」になります。後者だとすると、ID が 7 番のレコードが該当するので、name は「shinjyo」になります。
という事は、(1)は、「『aichi』と同じ kumi の値を持つ全てのレコード」という意味で、もし、レコードが複数見つかれば、そのいずれかのレコードと同じ name を持つレコードのうち、最後(ID が最大)のもの、と私は解釈しました。
それであれば、

select * from kiroku
where id = (
 select max(id) from kiroku
 where kumi in (
 select kumi from type 
              where name like 'aichi'
 )
 )

になります。結果は、

+------+------+-------+--------+
| id | kumi | name | title |
+------+------+-------+--------+
| 9 | 2 | aichi | 相田 |
+------+------+-------+--------+

となります。

(3)(1)と(2)で取得したデータから次記録されるべきデータを抽出します。
※画像の場合:テーブル「type」は「shinjyo」、 テーブル「data」は「辻」

ここで、全く分からなくなりました。これまで得られた結果から、どうすれば「shinjyo」や「辻」が導かれるのか、あるいは、(1)、(2)で私が勘違いしている点が有りましたら、解説いただけますか?

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ