1359296244 【ポイント有り】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側で処理したほうが速度が早い傾向にあるのであればそちらでも構いません。

回答の条件
  • 1人30回まで
  • 登録:
  • 終了:2013/01/31 01:26:37
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント200pt

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

(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)で私が勘違いしている点が有りましたら、解説いただけますか?

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません