質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1064閲覧

SQL文の質問。使用した日時順で商品を抽出。

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/10/13 03:13

編集2015/10/13 04:27

MySQLで、JAVAを使っています。

データの抽出SQL文が分からないので、教えてください。

下記の様に、会社名と商品名、商品を使用日時のテーブルがあります。
・company_id=0は、商品の全一覧の基本のレコードです。
・company_id=1000などは、実際に会社が使用した商品とその日時です。

goods_listテーブル

id company_id goods last_use_datetime
1 0 商品1 2015/01/01 01:01:01
2 0 商品2 2015/09/12 18:33:43
3 0 商品3 2015/02/01 01:01:01
4 0 商品4 2015/01/01 01:01:01
5 0 商品5 2015/08/25 17:21:43
6 0 商品6 2015/01/01 01:01:01

7 1000 商品2 2015/10/13 13:55:12
8 1000 商品6 2015/09/12 18:33:43
9 1000 商品5 2015/08/11 11:22:33

10 2000 商品1 2015/10/11 12:12:12

11 2000 商品4 2015/08/25 17:21:43
12 3000 商品1 2015/09/30 19:43:56

・id プライマリーキー
・company_id 複数存在
・goods 商品名
・last_use_datetime 最終使用日時

上記から、特定のcompany_idを指定し、
下記の様に、
・商品でユニークになり、
・使用時間の最近順
で抽出するには、どのようなSQL文を書けばよいでしょうか?

※抽出結果例) company_idに1000を指定した場合の抽出結果。

id company_id goods last_use_datetime
7 1000 商品2 2015/10/13 13:55:12
8 1000 商品6 2015/09/12 18:33:43
9 1000 商品5 2015/08/11 11:22:33
1 0 商品1 2015/01/01 01:01:01 ・company_id=1000で未使用の基本商品も抽出
4 0 商品4 2015/01/01 01:01:01 ・company_id=1000で未使用の基本商品も抽出
3 0 商品3 2015/02/01 01:01:01 ・company_id=1000で未使用の基本商品も抽出

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

回答する前にお尋ねします。
このテーブル設計は、今からでも変更可能ですか?

このテーブル設計のままでも一応このご質問内容だけの実現は可能ですが、非常にまずい設計であり早晩破綻することは明らかです。

投稿2015/10/13 03:55

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/10/13 04:01

はい、可能です。
yuba

2015/10/13 04:34

では、2つのテーブルに分けましょう。 ・商品マスタ ・最終利用履歴 の2つです。 また、商品を商品名だけで表現するのはやめてID番号を振りましょう。これは業務の中では出てこない、システムの中だけの番号としてかまいません。なぜなら、商品名の入力ミスひとつで誤作動が起こることになりますし、文字列同士の一致判定は単純にパフォーマンスを下げますし。 利用履歴は、カラム名から判断するにこれまでのすべての利用履歴ではなく各社・各商品の最終利用だけを記録しているのですよね? カラム構成は ●商品マスタ "products" id (int/AUTO_INCREMENT), name(VARCHAR) ●利用履歴 "last_usage" product_id(int), company_id(int), datetime(datetime) となります。 last_usageのproduct_idはproductsのidを外部キー参照します。 last_usageの主キーはproduct_id,company_idの複合です。 するとお求めの結果は ```sql SELECT p.id, p.name, u.product_id, u.datetime FROM products LEFT JOIN usage AS u ON p.id = u.product_id AND u.company_id = 【与えられた会社ID】 ``` で得られます。
退会済みユーザー

退会済みユーザー

2015/10/13 04:38

ご丁寧にありがとうございます。先を見越したテーブルへのご指摘もありがとうございます。早速テーブルを分割して、上記SQLをJAVAで作って、抽出してみます。
yuba

2015/10/13 05:20

last_usageテーブルにdatetimeというカラムを作りましたが、予約語をカラムに使うのはよろしくありませんでしたね。last_usage_datetimeに戻した方がいいです。
退会済みユーザー

退会済みユーザー

2015/10/14 10:32

ご丁寧にありがとうございます。招致しました。ようやく、他の作業や質問の嵐などの介入をかいくぐりながら、テーブルの作成とデータ移行、書きこみ部分が終わったので、このプログラムの開発を上記SQLまでのところにたどり着いたので、今から、SQL文で読み込みを作ります。それで完成になります。
退会済みユーザー

退会済みユーザー

2015/10/14 11:21

抽出までできましたが、普通に1番から順番に抽出されました。 「使用時間の最近順 」じゃないみたいなので、SQLを工夫してみます。できるかな。。。
退会済みユーザー

退会済みユーザー

2015/10/14 11:39

oder byをいれたら、正確に抽出できました。 テーブルの作成やSQLのご提供ありがとうございます。 無事に完成しました。 本当に助かりました。 お手数をお掛けしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問