- - PR -
SQLで困っています。
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-03-26 14:36
始めましてSAMと申します。
JAVAでMySQLにアクセスしてデータを抽出するプログラムを作成していますが、 現在SQL文の作り方で困っています。 データの登録日付(timestamp型)で降順に並び替えたいのですが、その登録データに関係するデータの日付も考慮に入れたいのです。 テーブルの構成は次のようになっています。 テーブルAの構成---------------- AID|データ|日付A| ------------------------------ テーブルBの構成---------------- BID|AID|データ|日付B| ------------------------------ このテーブルAのデータを日付でソートしたいのですが、もしテーブルBのAIDと一致するテーブルBが存在した場合は日付はテーブルBの日付を使いたいのです。(テーブルBのAIDと一致する物が無い場合はテーブルAの日付を) 例) テーブルA--------------------- AID|データ|日付A | 1|あああ|2004/01/01| 2|いいい|2004/02/01| 3|ううう|2004/03/01| ------------------------------ テーブルB--------------------- BID|AID|データ|日付B | 1| 1|あああ|2004/05/01| ------------------------------ 結果-------------------------- 1|あああ|2004/01/01| 3|ううう|2004/03/01| 2|いいい|2004/02/01| ------------------------------ このように結果を取得したいのですがSQLのORDER BYはどのように書けばよろしいのでしょうか? | ||||
|
投稿日時: 2004-03-26 14:49
以下でいかがでしょうか?(返り値が増えますが・・・)
SELECT A.AID, A.データ, A.日付A, CASE WHEN B.日付B IS NULL THEN A.日付A ELSE B.日付B END 日付C FROM A LEFT OUTER JOIN B ON A.AID = B.AID ORDER BY 日付C # 間違いを訂正しました。 # ちなみに以下を参考にしました。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_09.htm [ メッセージ編集済み 編集者: taro 編集日時 2004-03-26 15:01 ] | ||||
|
投稿日時: 2004-03-26 15:13
taroさんのSQLを少々修正してみました。 SELECT A.AID, A.データ, COALESCE(日付B,日付A) 日付 FROM A LEFT OUTER JOIN B ON A.AID = B.AID ORDER BY 日付 | ||||
|
投稿日時: 2004-03-26 15:54
takuさんtaroさん返信ありがとうございます。
takuのSQLを参考に書いて見ましたがLEFT OUTER JOIN以下でエラーが出てしまいました。 実際はこの例と違ってWHERE文が入るのでそのせいでしょうか? 実際はAのカラムは次のようになっています(一番左がキーとなっています) |contribution|category|name|title|day|pass|comment|mail|image|imageflg| Bは次のようになっています。 |reply|contribution|name|day|pass|comment|mail| これのdayが日付となっています。 抽出したいデータは、Aのmailとimage以外すべてです。(Bのデータは一つもいりません) これにcategoryが1のものと言う条件で取り出し、ソートは最初の投稿で言った形にしたいのです。 #すいません書き忘れていましたが、reply(テーブルB)は同じAIDを持つものがありますので reply.dayの最大値でソートします。MAX(reply.day)で、できると思いますが・・・ [ メッセージ編集済み 編集者: SAM 編集日時 2004-03-26 16:01 ] | ||||
|
投稿日時: 2004-03-26 16:39
takuさま、修正ありがとうございました。
SAMさま、AIDがユニークであるのを前提としていました。すみません。 エラーの内容が分かりませんが、以下ではいかがでしょうか? (列名は最初にあったものが分かりやすいのでそのまま使っています) SELECT A.AID, A.データ, COALESCE(日付B,日付A) 日付 FROM A LEFT OUTER JOIN B ON A.AID = B.AID WHERE B.日付B=(SELECT MAX(B.日付B) FROM B WHERE AID=B.AID) ORDER BY 日付 # あまりきれいでないと思いますが、これしか思いつきませんでした・・・。 # 誤字修正 [ メッセージ編集済み 編集者: taro 編集日時 2004-03-26 16:41 ] | ||||
|
投稿日時: 2004-03-26 17:57
taroさん返信ありがとうございます。
参考にSQLを組んでみましたがエラーが出てしまいます。 SQL----------------------------------------------------------------------------- select contribution.contribution,contribution.title,COALESCE(reply.day,contribution,day)day,contribution.name,contribution.comment,contribution.imageflg FROM contribution LEFT OUTER JOIN reply ON contribution.contribusion=reply.contribution WHERE reply.day=(SELECT MAX(reply.day) FROM reply WHERE contribution.contribution=reply.contribution AND contribution.category=0 ORDER BY day -------------------------------------------------------------------------------- エラー-------------------------------------------------------------------------- java.sql.SQLException: Syntax error or access violation: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT MAX(reply.day) FROM reply WHERE contribution.contributio -------------------------------------------------------------------------------- 前の部分は合っているのか試すためにこんなコードでもやってみました。 SQL----------------------------------------------------------------------------- SELECT contribution.title,COALESCE(reply.day,contribution,day)day FROM contribution LEFT OUTER JOIN reply ON contribution.contribusion=reply.contribution -------------------------------------------------------------------------------- エラー-------------------------------------------------------------------------- java.sql.SQLException: General error: Column: 'contribution' in field list is ambiguous -------------------------------------------------------------------------------- 何処がいけないのでしょうか? | ||||
|
投稿日時: 2004-03-26 18:19
1番目のエラー:シンタックス(構文)エラーです。教えてもらったSQLと書いたSQLを見比べてください。
(括弧とかカッコとかかっことか) 2番目のエラー:ambiguousの意味を辞書で調べてください。そうすれば、わかるはず。 (「山田さん」って呼んでも、「2丁目の山田さん」「3丁目の山田さん」なのか分からない。) 最近丸投げな投稿が増えましたね。 [ メッセージ編集済み 編集者: アティ 編集日時 2004-03-26 18:25 ] | ||||
|
投稿日時: 2004-04-01 18:06
こんにちはナスティキャットです。
となっていますが、SAMさんのデータベース構成を見ると、日付のフィールド名が被っているので SELECT A.AID, A.データ, COALESCE(B.日付,A.日付) 日付 FROM A LEFT OUTER JOIN B ON A.AID = B.AID WHERE B.日付=(SELECT MAX(B.日付) FROM B WHERE AID=B.AID) ORDER BY 日付 となると思います。 ちなみに私は前に似たSQLを組みましたが、 WHERE B.日付=(SELECT MAX(B.日付) FROM B WHERE AID=B.AID) この括弧でSELECT文を使うような文所でエラーが出ていました。 | ||||
