JAVAで、MySQLを使っています。
SQL文が組めなくて、困っています。
会社ID+社員ID+顧客IDの組み合わせのレコードが、複数存在するテーブルです。
下記のSQL文だと、
会社ID+社員ID+顧客IDの、各IDに該当するレコードが複数抽出されてしまいますが、
抽出したいのは、
関数の引数の 会社ID、社員ID、顧客IDに一致した、
会社ID+社員ID+顧客IDで、write_datetimeが一番大きい レコード。のパターンを全件抽出したいのです。
尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
※iPara_company_id=1、iPara_user_id=1、iPara_customar_id=1など関数に渡す引数に一致したレコードだけ抽出したい。
■テーブルの例 ※後記「②」のパターンをわかりやすくしたテーブル例。
id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
1 3 3 1 1 2015-08-01 15:11:23
2 1 1 1 1 2015-08-02 13:11:11
3 1 1 1 1 2015-08-03 09: 31:21 ←最終日時のこれを抽出
4 2 1 1 1 2015-08-04 13:11:11
5 2 1 1 1 2015-08-05 15:11:23
6 2 1 1 1 2015-08-06 13:11:11 ←最終日時のこれを抽出
7 4 5 1 1 2015-08-08 15:11:23
8 4 5 1 1 2015-08-08 16:12:11
9 5 1 1 1 2015-08-08 15:11:23
10 5 1 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出
※idは、プライマリーキー。
※DB構造が同じパターンの値が複数あり、無駄なつくりに見えるかもしれませんが、
仕様書との観点から、他DB用SQLからのJOINや呼び出しで利便性を高めた結果、
このような意見すると無駄に見えるパターンになっております。
(熟練者の方なら、もっと良いテーブルがすぐに作れるのは承知しております)
■8/2 19:57 追記:
下記SQL文を作ったのですが、GROUP BYでレコードは、ユニークに抽出できているのですが、
最大日付(write_datetime)を拾ってこない状態です。
String strSQL =
"SELECT *"
+ " FROM commpany_list"
+ " WHERE"
+ " id IN"
+ " (SELECT MAX(id)"
+ " FROM commpany_list"
+ " WHERE"
+ " (company_id = " + iPara_company_id + ")" // 会社ID
+ " AND (user_id = " + iPara_user_id + ")" // ユーザーID
+ " AND (customer_id = " + iPara_customer_id + ")" // 社員ID
+ " AND (delete_flag = false)" // 削除フラグ
+ " GROUP BY index_id, commpany_id, customer_id, user_id)"
+ " ORDER BY write_datetime DESC";
■8/22 9:18 S_Minecraft様のご要望で、関数へパラメーターを渡す部分を含めたソースを掲載。
public int getAllCompany_Pattern_List(
int iPara_company_id
, int iPara_user_id
, int iPara_customer_id
)
{
try {
// DBオープン
DB.open();
// リストを抽出。 if (iPara_customer_id <= 0) { // ★★★①のパターン★★★ **// iPara_customer_id <= 0 の時は、パターンや抽出条件にcustomer_idを入れない。** String strSQL = "SELECT *" + " FROM commpany_list" + " WHERE" + " id IN" + " (SELECT MAX(id)" + " FROM commpany_list" + " WHERE" + " (company_id = " + iPara_company_id + ")" // 会社ID + " AND (user_id = " + iPara_user_id + ")" // ユーザーID + " AND (delete_flag = false)" // 削除フラグ + " GROUP BY index_id, company_id, user_id)" + " ORDER BY write_datetime DESC"; // SELECT用のSQL実行メソッド DB.executeQuery(strSQL); } else { // ★★★②のパターン★★★ String strSQL = "SELECT *" + " FROM commpany_list" + " WHERE" + " id IN" + " (SELECT MAX(id)" + " FROM commpany_list" + " WHERE" + " (company_id = " + iPara_company_id + ")" // 会社ID + " AND (user_id = " + iPara_user_id + ")" // ユーザーID + " AND (customer_id = " + iPara_customer_id + ")" // 顧客ID + " AND (delete_flag = false)" // 削除フラグ + " GROUP BY index_id, company_id, customer_id, user_id)" + " ORDER BY write_datetime DESC"; // SELECT用のSQL実行メソッド DB.executeQuery(strSQL); } 以下省略 } catch(・・・
}
以上
■追記: 8/22 11:31
下記SQLで、「②」のパターンが正常に抽出でき、解決。
あとは、「①」のパターンの抽出のSQL。
String strSQL = "SELECT * FROM commpany_list AS m"
- "WHERE m.delete_flag = false"
- "AND m.company_id = " + iPara_company_id
- "AND m.user_id = " + iPara_user_id
- "AND m.customar_id = " + iPara_customar_id
- "AND NOT EXISTS ("
- " SELECT 1 FROM commpany_list AS s"
- " WHERE m.index_id = s.index_id"
- " AND m.delete_flag = false"
- " AND m.write_datetime < s.write_datetime"
- ")"
- "ORDER BY m.write_datetime DESC";
「①」のパターンのテーブル例。
■テーブルの例 ※上記「①」のパターンをわかりやすくしたテーブル例。
id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
1 1 1 1 0 2015-08-01 15:11:23
2 1 1 1 0 2015-08-02 13:11:11
3 1 1 1 0 2015-08-03 09: 31:21 ←最終日時のこれを抽出
4 2 1 1 0 2015-08-04 13:11:11
5 2 1 1 0 2015-08-05 15:11:23
6 2 1 1 0 2015-08-06 13:11:11 ←最終日時のこれを抽出
7 4 5 1 0 2015-08-08 15:11:23
8 4 5 1 0 2015-08-08 16:12:11
9 5 1 1 0 2015-08-08 15:11:23
10 5 1 1 0 2015-08-08 16:12:11 ←最終日時のこれを抽出
11 6 3 1 1 2015-08-01 15:11:23
12 7 1 1 1 2015-08-02 13:11:11
13 7 1 1 1 2015-08-03 09: 31:21 ←最終日時のこれを抽出
14 8 1 1 1 2015-08-04 13:11:11
15 8 1 1 1 2015-08-05 15:11:23
16 8 1 1 1 2015-08-06 13:11:11 ←最終日時のこれを抽出
17 9 5 1 1 2015-08-08 15:11:23
18 9 5 1 1 2015-08-08 16:12:11
19 10 1 1 1 2015-08-08 15:11:23
20 10 1 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出
以上
■追記:8/22 13:25
上記「①」の抽出ができました。
String strSQL = "SELECT * FROM commpany_list AS m"
- "WHERE m.delete_flag = false"
- "AND m.company_id = " + iPara_company_id
- "AND m.user_id = " + iPara_user_id
//+ "AND m.customar_id = " + iPara_customar_id ← ここをコメントアウトしただけ。
- "AND NOT EXISTS ("
- " SELECT 1 FROM commpany_list AS s"
- " WHERE m.index_id = s.index_id"
- " AND m.delete_flag = false"
- " AND m.write_datetime < s.write_datetime"
- ")"
- "ORDER BY m.write_datetime DESC";
以上
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/08/21 12:58
2015/08/21 13:35
2015/08/21 13:42
2015/08/21 14:06 編集
退会済みユーザー
2015/08/21 23:54
退会済みユーザー
2015/08/22 02:28
退会済みユーザー
2015/08/22 04:31