• ベストアンサー

SQL文の書き方

次のような列の2つテーブルがあります ID,メッセージ,書いた日 ID,名前 一つ目のテーブルに メッセージを追加していき IDの違う最新のメッセージだけ取り出したいのですが 考えても分からなくて… SELECT ID,MAX(書いた日) FROM 一つ目のテーブル GROUP BY ID の時のIDそれぞれのメッセージが取り出せればいいのですが 最終的には IDの部分は別テーブルにある IDと一致する名前に置き換えて取り出したいと思っています よろしくお願いします データベースはPostgreSQLを使っています

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

  • ベストアンサー
回答No.1

PostgreSQLは使用したことがないのですが、PostgreSQL も副問い合わせは使用できますよね? T1 : ID,メッセージ,書いた日 T2 : ID,名前 とすると SELECT   T1.ID,   T1.書いた日,   T1.メッセージ,   T2.名前 FROM   (SELECT     ID,     MAX(書いた日) AS 書いた日   FROM T1     GROUP BY ID   ) S,   T1,   T2 WHERE   T1.ID = S.ID   AND T1.書いた日 = S.書いた日   AND S.ID = T2.ID; のような感じでできるんじゃないかと思います。

longhorn
質問者

お礼

回答ありがとうございます 返事がおくれてすみません なるほど これならうまくいきそうです 勉強になります ありがとうございました

関連するQ&A

  • 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文で教えてください

    初めてです。お願いします。 次のようなテーブルがあります。 ID kosuu ------------ 1 3 2 5 3 1 kosuuの一番大きい値とそれに紐づくIDを取得したいのですが SELECT ID, Max(kosuu) FROM tblX と書くと、IDが不正だとおこられてしまいます。 ID kosuu ------------ 2 5 を抽出するにはどうしたらよいでしょうか? Access2000です。宜しくお願いします。

  • SQLのこと:distinctして並び替えたい

    select * from (select distinct on (aaa) * from bbb) as ccc order by ddd テーブルbbbのaaaというフィールドが重複せず、しかも他のフィールドで並び替えをしたかったら、このような書き方以外ありますか?データベースはPostgreSQLです。 この書き方で不都合が出ているというわけではありませんが、どう書けば、パフォーマンス的にも良いSQLになるか、詳しい方がいらっしゃいましたら、お願いします。

  • ACCESSでSQL文

    宜しくお願いします。 ACCESS2000で 仕訳帳テーブルの特定期間の科目ID別集計を中間テーブルに生成する処理の以下の文でエラーメッセージが出ます。 DoCmd.RunSQL ("Insert Into 中間(月度,科目ID,借方計,貸方計) " _ & "Select 開始日,科目ID,sum(借方),Sum(貸方) From 仕訳帳" _ & "Group By 科目ID where (仕訳日 >= 開始日) and (仕訳日 <= 終了日)") エラーメッセージの内容は 「クエリー式’科目ID where (仕訳日 >= 開始日) and (仕訳日 <= 終了日)'の構文エラー:演算子がありません」

  • (初心者です)パフォーマンスの良いSQLの書き方

    SQL初心者です。初歩的かもしれませんが 教えていただけると助かります。 社員情報を管理するマスタテーブル『MST』(PKはSHAIN_ID)、 社員のシステムログイン履歴をログとして残すテーブル『LOG』 (PKはSEQのみ、SHAIN_IDとLOGIN_DATEを持つ) があります。 社員ごとに最新のログイン日付を表示するとき、 以下のようなSQLを書いたところ「パフォーマンス上あまりよくないSQL」 と言われてしまったのですが、どのように改善すればよいでしょうか? ------------------------------------------ SELECT MST.SHAIN_ID,     MST.SHAIN_NAME,     LOG.LOGINTIME FROM  MST,    (SELECT LOGINUSERID,        MAX(LOGINDATE) LOGINDATE     FROM LOG     GROUP BY SHIAN_ID    ) LOG WHERE MST.SHAIN_ID = LOG.SHAIN_ID ORDER BY    MST.SHAIN_ID ------------------------------------------

  • 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)

  • 条件付GROUP BY句の記述方法

    テーブルAには 列A 数値列 ID列(主キー) の 3つの列があるのですが このテーブルのデータを列AでGROUP BYする際 ID列のデータが5と10の物だけGROUP BYの 対象にしたいのですが そのまま流すとGROUP BYでIDが指定されてません、 HAVING句では無効です。 とメッセージが出ます、 かと言ってID列をGROUP BYすると 主キーなのでSUMが5と10の物に分かれてしまいます。 これはどのようにして回避すればいいのでしょうか? SELECT 列A,SUM(数値列) FROM テーブルA GROUP BY 列A HAVING ID列 IN (5,10) 環境 Win2000 SQLServer2000

  • SQLのcount()とgroup by

    以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。

  • SQL文 2つのテーブルから、グループごとの合計を求める

    テーブル名:グループ表 ID   グループ名 ------------------------- 100   Aグループ 101   Bグループ 102   Cグループ 103   Dグループ 104   Eグループ テーブル名:売上表 ID   売上年月日   売上額 ------------------------------ 101   20090401   1000 101   20090501   2000 102   20090401   2500 102   20090503   1500 103   20090404   3000 103   20090506   4000 上記の2つのテーブルがあります。 グループごとの売上合計一覧を出します。 ■求めたいSELECT文結果 グループ名   合計(売上額) ---------------------- Aグループ    0 Bグループ   3000 Cグループ   4000 Dグループ   7000 Eグループ    0 select グループ名,sum(売上額)  from (select グループ名,売上額     from グループ表,売上表      where グループ表.ID = 売上表.ID)   group by グループ名 では、 グループ名   合計(売上額) ---------------------- Bグループ   3000 Cグループ   4000 Dグループ   7000 となってしまい、うまくいきません・・・ どうように書いたらよろしいでしょうか?

  • SQL文について

    次のSQL文のうちで、適切なものはどれか。 学生表(学生番号,学生氏名,所属学科,取得単位数) 答えはこれ↓なんですが、なぜなのかがわかりません。 SELECT 所属学科,MAX(取得単位数)  FROM 学生表        GROUP BY 所属学科