• ベストアンサー
  • 困ってます

SQL文でテーブルを作りたいのですが・・・

テーブルを作りたいのですが、思い描くテーブルが作れず、困っています・・・ 例えばMさんがA→B→C→Dと旅行に行ったとします。 そのとき、行った場所によって日付が登録されるようにしたいと思っています。 このように、別な人もいろいろと旅行し、それぞれの日付があり、どんどんと格納していきます。 最初に ID id 日付 date 場所 point (名前はとりあえず、IDとします) でテーブルを作ろうとしましたが、これだとID一つにつき、日付と場所も一つずつしか入りませんよね? どういったテーブルを作ればいいでしょうか? 思い描くテーブルは下記のような感じです。 ID     日付      場所 -------------- 1  |2010/10/06 |  A   |2010/10/14 |  B   |2010/10/20 |  C   |2010/10/25 |  D -------------------------- 2  |2010/10/23 |  B    |2010/10/24 |  A    |2010/10/25 |  D    |2010/10/27 |  C -------------------------- 3  |2010/10/25 |  D    |2010/10/27 |  C    |2010/11/03 |  B    |2010/11/04 |  A    |2010/11/07 |  D    |2010/11/10 |  C ------------------------- 4  |2010/11/10 | B    |2010/11/15 |  A    |2010/11/16 |  D ・・・・・・・・・・・・・・・ このように一つのIDに対して、日付と場所がランダムの数で格納したいのですが、これって可能でしょうか? テーブルを2つ(以上)作り、外部キーを使ってもかまいません。 また、足りなければ違うIDなどでカバーしてもかまいません。 実際は、このようなテーブルを作り、一人毎の動線を調べるために活用したいと思っています。 Mさん:今日はAに行って、明日はBに行き、明後日はCに行った。すなわち動線は・・・のような感じです。 SQL文でテーブルを作ってください。 補足事項等ありましたらご指摘下さい。追加いたします。 よろしくお願いします。

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

  • 回答数2
  • 閲覧数39
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.1
  • anmochi
  • ベストアンサー率65% (1332/2045)

 一読して、気になった事は2つ。 1.提示されたテーブルで「ID」が何を指すのか分からない。 2.Mさんという情報がテーブルの中にない。 仮に、IDがMさん、すなわち人物を指すのであれば、テーブルはこのままで良い。主キーがID単独ではなく、ID、日付、場所の3つに対して付与されれば良い。 MySQLで以下のような書き方が許されるかはわからない(当方、Oracle、DB2、Microsoft SQL Server、PostgreSQLの4つくらいしか普段使わない)が、とりあえずこれを参考にMySQLで「複合主キー」をはるにはどうすれば良いか調べてみると良いだろう。 CREATE TABLE TRIP ( ID id, 日付 date, 場所 point, CONSTRAINT PK_TRIP PRIMARY KEY(ID,日付,場所) -- 複合主キーと言い、ID、日付、場所の3つの組み合わせがユニークとなる制約を作成する )

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

質問者からの補足

ご回答ありがとうございます。 説明不足で申し訳ないです・・・ 簡略化するためMさんをIDに置き換えました。 本来は、IDを外部キーにして、外部で人物(Mさん)を登録しようとしてました。 ですが、質問どおりMさんを置いといて考えていただいて結構です! 複合主キーは使ったことなかったです。参考になりました。 一度それで作ってみようと思います。

関連するQ&A

  • SQL文を教えてください。

    特定の日付Xを指定した場合、 以下のような結果になるSQL文を教えてください。 よろしくお願いします。 1) 日付X = 2003-12-17 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 001 2003-12-10 2003-12-12 2003-12-14 002 2003-12-15 ---------- 2003-12-16 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- 2) 日付X = 2003-12-11 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- table A(テーブルAには全ユーザのデータがあります) ID DATE ------------------ 001 2003-12-10 002 2003-12-15 003 2003-12-06 004 2003-12-08 table B ID DATE ------------------ 001 2003-12-12 003 2003-12-10 table C ID DATE ------------------ 001 2003-12-14 002 2003-12-16

  • SQL文にて・・・

    質問があります。PostgreSQLです。 テーブル(test_tbl)があるとします。 テーブル構成は --------------------------- id ===== char(16) [英数文字格納] point ==== int2 add_date ==== timestamp --------------------------- このテーブルから idが2文字目から'di6ek68dh5ls7g'のレコードを取得したいと考えています。 レコード数がかなりおおいので パフォーマンスを重視したいのですが、 検索SQLがわかりません。 select * from test_tbl where id like '%di6ek68dh5ls7g'だとでると おもうのですが、 これ以上にパフォーマンスがあがる SQLがわかる方お願いいたします。

  • SQL CASE 文について

    開発環境 SQLSERVER VB2005 SQLのCASE文についての質問ですが、DATE型のデータが有効値の場合は”スペース”それ以外の場合は格納されているDATE型を表示したいのですが、どなたかご教授お願いいたします。下記のSQLでは全ての日付が出てしまいます。 SELECT CASE 日付 WHEN '2000/01/01' THEN ' '     ELSE 日付          END AS Expr1 FROM  テーブル CASE文以外でもできますか? よろしくお願いいたします。

その他の回答 (1)

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

create table tbl(ID int,HIDUKE date,POINT varchar(10)); INSERT INTO tbl values( '1','2010/10/06','A'),( '1','2010/10/14','B'),( '1','2010/10/20','C'),( '1','2010/10/25','D'),( '2','2010/10/23','B'),( '2','2010/10/24','A'),( '2','2010/10/25','D'),( '2','2010/10/27','C'),( '3','2010/10/25','D'),( '3','2010/10/27','C'),( '3','2010/11/03','B'),( '3','2010/11/04','A'),( '3','2010/11/07','D'),( '3','2010/11/10','C'),( '4','2010/11/10','B'),( '4','2010/11/15','A'),( '4','2010/11/16','D'); というデータ保持をして SELECT GROUP_CONCAT(POINT ORDER BY HIDUKE ASC) FROM tbl WHERE ID='1' とすればよいでしょう

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

質問者からのお礼

シンプルに考えてよかったんですね・・・ 難しく考えすぎてたようです。 ご回答ありがとうございました。

関連するQ&A

  • SQLの質問です

    SQL初心者の質問です。下記のように違うdateを持つ同じgrade_idがいくつか存在するテーブルから、最新のdateのgrade_idを選択してその列の他の情報(point)も持って来たい場合、どんなSQL文が最適でしょうか?Disthinctを使ってもうまくできずに困っています…よろしくお願い致します。 id date grade_id point 1 2008/05/01 1 6 2 2008/10/01 1 1 3 2000/08/08 2 2 4 2008/05/01 2 8

  • SQLの質問です

    SQL初心者の質問です。下記のように違うdateを持つ同じgrade_idがいくつか存在するテーブルから、最新のdateのgrade_idを選択してその列の他の情報(point)も持って来たい場合、どんなSQL文が最適でしょうか?Disthinctを使ってもうまくできずに困っています…よろしくお願い致します。 id ・ date ・ grade_id ・ point 1 ・ 2008/05/01 ・ 1 ・ 6 2 ・ 2008/10/01 ・ 1 ・ 1 3 ・ 2000/08/08 ・ 2 ・ 2 4 ・2008/05/01 ・ 2 ・ 8

  • mysqlでのsql文

    下記のようにテーブルが有り、外部キーの設定も済んでいますが、 PHPファイル内で「select * form song WHERE song_name LIKE '%%'」と実行すると 「0,眠り姫,0」と表示されます。 このsql文を実行した上の結果の一番右側を「0」でなく「栗林みな実」と出力したいのですが、 なにぶん最後にsqlを扱ったのが5年以上前で、 全部頭から抜けてしまっていますorz 外部キーは「song」テーブルのkashu_IDと「kashu」テーブルのkashu_IDに設定してあります。 mysqlのバージョンは5.1.69

    • ベストアンサー
    • MySQL
  • mysqlのsql文について教えて下さい

    mysqlのsql文について教えて下さい 下記のようなテーブルとデータがあった場合に どうやれば 2,次郎だけを抽出できますか? 本日日付(2010-08-06)が 既にテーブルBにdateが存在する場合は 3,1,2010-08-04 3,1,2010-08-06を 対象外にしたいです。 Aテーブル id,user 1,太郎 2,次郎 3,3郎 Bテーブル targetid,homonid,date(datetime型) 3,1,2010-08-04 3,1,2010-08-06 3,2,2010-08-05 下記だと2010-08-04にヒットしてしまい(当たり前?)動作しません。 select distinct a.* from tblA a, tblB b where date_format(b.date, "%Y-%m-%d") <> "2010-08-06" ;

  • SQL文に関して教えてください。

    SQL文に関して教えてください。 SQLServer2005を利用し、マイクロソフトアクセスでadpを利用して構築を初めて行っています。 そこで、SQLServerのビューこのような事は可能でしょうか? (ビューをネストすれば出来るのですが、1つのSQL内で完結させたい) 色々探し、近い物はあったのですが、若干異なります。 フィールドがID1、ID2、ID3、date、txtと存在するとします。 ID1 ID2 date txt 1 1 20100801 test 2 1 20100901 Null 3 3 20100928 Null txtフィールドがNullのレコードを対象とし、dateが一番古い日付のレコード、nullのレコード数を 取り出す。結果としては以下が出れば正解です。 (グループ化が必要かと思います) ID1 ID2 date レコード数 2 1 20100901 2 やはり難しいでしょうか? 御教授願います。

  • 複雑なSQL文について

    SQLite バージョン3.7.10 を使用しています。 以下のサイトにソースがあります。 http://ideone.com/7FPtHL どう説明するのが適切なのかあまり分かりませんが、 よろしくお願い致します。 t5テーブルにおいて t2テーブルのt1_key1が't1_key_1' かつ t5テーブルのt3_keyに対応するt3テーブルのt1_keyに対応するt2テーブルのt1_key2の 例えば2012年1月の (t5テーブルのprofit × その日(t5テーブルのdateの日の部分)に対応した2テーブルのrate) を t4テーブルのkeyごとにグループ化してその合計値を高い順に出力したいのですが、 のですがどのようなSQL文を書けば良いのでしょうか? ※ ただし、もしt5テーブルのdateに対応する日付がt2テーブルのdateにない場合は、 t5テーブルのdateに対応する月(年も含めて)のt2テーブルのrateの平均値、 それもない場合は、t5テーブルのdateに対応する年のt2テーブルのrateの平均値、 それもない場合は、t5テーブルの全てのrateの平均値、 を取得してt5テーブルのprofitにかけたいのです。。 ※ 例えばこのデータなら 2012年1月は +----------+------+ | t4_name  | sum | +----------+------+ | t4_name_1 |500000| +----------+------+ | t4_name_2 |150000| +----------+------+ という結果が得たいです。 t5テーブルのdateの'2012-01-03 00:00:02'の日付に対応するt2テーブルのdateは存在しないので、 t2テーブルの1月(2012-01)のrateの平均値((100+200+300)/3=200)を profitにかけています。 複雑すぎるというか自分でもうまく説明できないので、 せめて※の部分のSQLの書き方だけでもアドバイス頂けないでしょうか?

  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • 以下の場合のSQL文の書き方教えてください。

    2つのテーブルÅ、Bに同じ項目名(NYUSYA_DATE)が存在していて、 通常はAからデータを取得し、取得した値がNULLの場合は、Bから取得します。 これを1つのSQLで出来ますか? 今は、両方取得しておいて、IF文で判定しようとしています。 テーブルA SYAIN_ID (NOT NULL) NYUSYA_DATE テーブルB GROUP_ID (NOT NULL) SYAIN_ID NYUSYA_DATE

  • SQL文でのデータの取得が上手くいきません

    初めて質問させていただきます。 こちらのカテゴリで良いのか分からなかったのですが、よろしくお願いいたします。 SQL文を作成しているのですが、上手くいかず困っている状況です。 要件としてはテーブルAにユーザーの情報が格納されているのですが、 キーの一つとして世代(SEDAI_NO)(日付)を持っております。 今回取り出したいデータは該当ユーザーの処理日以前の最新のデータを 取得したいと思い以下のSQL文を作成しましたが、上手く行かず、最新世代を含むそれ以前の世代のデータを取得してきています。 どこがおかしいのでしょうか? よろしくお願いいたします。 【作成したSQL】 select * from テーブルA テーブルA’ where (USER_ID=該当のユーザーID) and (SEDAI_NO = (select max(SEDAI_NO) from テーブルA where SEDAI_NO = テーブルA’.SEDAI_NO AND 処理日 >= テーブルA'.SEDAI_NO)

  • 期間の重複を調べるSQL文について・・・

    EVENT --+------------+------------+ id | start_date | end_date --+------------+------------+ 0 | 2007-06-01 | 2007-06-03 | --+------------+------------+ 1 | 2007-06-04 | 2007-04-06 | --+------------+------------+ 2 | 2007-06-02 | 2007-06-05 | ↑こんな感じでイベントを管理するテーブルがあります。 イベントの開催期間の重複を出力するSQL文を書きたいのですが、 何かいい案はありませんでしょうか??? 結果的には重複し合っているレコードのidを出力させたいです。 よろしくお願いします。