teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

17

解決

2015/08/22 04:27

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -163,4 +163,23 @@
163
163
  19 10 1 1 1 2015-08-08 15:11:23
164
164
  20 10 1 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出
165
165
 
166
+ 以上
167
+
168
+
169
+ ■追記:8/22 13:25
170
+ 上記「①」の抽出ができました。
171
+
172
+ String strSQL = "SELECT * FROM commpany_list AS m"
173
+ + "WHERE m.delete_flag = false"
174
+ + "AND m.company_id = " + iPara_company_id
175
+ + "AND m.user_id = " + iPara_user_id
176
+ //+ "AND m.customar_id = " + iPara_customar_id ← ここをコメントアウトしただけ。
177
+ + "AND NOT EXISTS ("
178
+ + " SELECT 1 FROM commpany_list AS s"
179
+ + " WHERE m.index_id = s.index_id"
180
+ + " AND m.delete_flag = false"
181
+ + " AND m.write_datetime < s.write_datetime"
182
+ + ")"
183
+ + "ORDER BY m.write_datetime DESC";
184
+
166
185
  以上

16

「①」のパターンを追加

2015/08/22 04:27

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -19,7 +19,7 @@
19
19
 
20
20
  ※iPara_company_id=1、iPara_user_id=1、iPara_customar_id=1など関数に渡す引数に一致したレコードだけ抽出したい。
21
21
 
22
- ■テーブルの例
22
+ ■テーブルの例 ※後記「②」のパターンをわかりやすくしたテーブル例。
23
23
  id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
24
24
  1 3 3 1 1 2015-08-01 15:11:23
25
25
  2 1 1 1 1 2015-08-02 13:11:11
@@ -135,4 +135,32 @@
135
135
  + " AND m.delete_flag = false"
136
136
  + " AND m.write_datetime < s.write_datetime"
137
137
  + ")"
138
- + "ORDER BY m.write_datetime DESC";
138
+ + "ORDER BY m.write_datetime DESC";
139
+
140
+ -------------------------------------------------------
141
+
142
+ 「①」のパターンのテーブル例。
143
+ ■テーブルの例 ※上記「①」のパターンをわかりやすくしたテーブル例。
144
+ id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
145
+ 1 1 1 1 0 2015-08-01 15:11:23
146
+ 2 1 1 1 0 2015-08-02 13:11:11
147
+ 3 1 1 1 0 2015-08-03 09: 31:21 ←最終日時のこれを抽出
148
+ 4 2 1 1 0 2015-08-04 13:11:11
149
+ 5 2 1 1 0 2015-08-05 15:11:23
150
+ 6 2 1 1 0 2015-08-06 13:11:11 ←最終日時のこれを抽出
151
+ 7 4 5 1 0 2015-08-08 15:11:23
152
+ 8 4 5 1 0 2015-08-08 16:12:11
153
+ 9 5 1 1 0 2015-08-08 15:11:23
154
+ 10 5 1 1 0 2015-08-08 16:12:11 ←最終日時のこれを抽出
155
+ 11 6 3 1 1 2015-08-01 15:11:23
156
+ 12 7 1 1 1 2015-08-02 13:11:11
157
+ 13 7 1 1 1 2015-08-03 09: 31:21 ←最終日時のこれを抽出
158
+ 14 8 1 1 1 2015-08-04 13:11:11
159
+ 15 8 1 1 1 2015-08-05 15:11:23
160
+ 16 8 1 1 1 2015-08-06 13:11:11 ←最終日時のこれを抽出
161
+ 17 9 5 1 1 2015-08-08 15:11:23
162
+ 18 9 5 1 1 2015-08-08 16:12:11
163
+ 19 10 1 1 1 2015-08-08 15:11:23
164
+ 20 10 1 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出
165
+
166
+ 以上

15

②解決

2015/08/22 02:41

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -117,4 +117,22 @@
117
117
  catch(・・・
118
118
  }
119
119
 
120
- 以上
120
+ 以上
121
+
122
+
123
+ ■追記: 8/22 11:31
124
+ 下記SQLで、「②」のパターンが正常に抽出でき、解決。
125
+ あとは、「①」のパターンの抽出のSQL。
126
+
127
+ String strSQL = "SELECT * FROM commpany_list AS m"
128
+ + "WHERE m.delete_flag = false"
129
+ + "AND m.company_id = " + iPara_company_id
130
+ + "AND m.user_id = " + iPara_user_id
131
+ + "AND m.customar_id = " + iPara_customar_id
132
+ + "AND NOT EXISTS ("
133
+ + " SELECT 1 FROM commpany_list AS s"
134
+ + " WHERE m.index_id = s.index_id"
135
+ + " AND m.delete_flag = false"
136
+ + " AND m.write_datetime < s.write_datetime"
137
+ + ")"
138
+ + "ORDER BY m.write_datetime DESC";

14

①②のパターン区分け追加

2015/08/22 02:32

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -73,6 +73,7 @@
73
73
 
74
74
  // リストを抽出。
75
75
  if (iPara_customer_id <= 0) {
76
+ // ★★★①のパターン★★★
76
77
  **// iPara_customer_id <= 0 の時は、パターンや抽出条件にcustomer_idを入れない。**
77
78
  String strSQL =
78
79
  "SELECT *"
@@ -92,6 +93,7 @@
92
93
  DB.executeQuery(strSQL);
93
94
  }
94
95
  else {
96
+ // ★★★②のパターン★★★
95
97
  String strSQL =
96
98
  "SELECT *"
97
99
  + " FROM commpany_list"

13

BOLD

2015/08/22 02:30

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -73,7 +73,7 @@
73
73
 
74
74
  // リストを抽出。
75
75
  if (iPara_customer_id <= 0) {
76
- // iPara_customer_id <= 0 の時は、パターンや抽出条件にcustomer_idを入れない。
76
+ **// iPara_customer_id <= 0 の時は、パターンや抽出条件にcustomer_idを入れない。**
77
77
  String strSQL =
78
78
  "SELECT *"
79
79
  + " FROM commpany_list"

12

ソース例掲載

2015/08/22 00:25

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -56,4 +56,63 @@
56
56
  + " AND (customer_id = " + iPara_customer_id + ")" // 社員ID
57
57
  + " AND (delete_flag = false)" // 削除フラグ
58
58
  + " GROUP BY index_id, commpany_id, customer_id, user_id)"
59
- + " ORDER BY write_datetime DESC";
59
+ + " ORDER BY write_datetime DESC";
60
+
61
+
62
+ ■8/22 9:18 S_Minecraft様のご要望で、関数へパラメーターを渡す部分を含めたソースを掲載。
63
+
64
+ public int getAllCompany_Pattern_List(
65
+ int iPara_company_id
66
+ , int iPara_user_id
67
+ , int iPara_customer_id
68
+ )
69
+ {
70
+ try {
71
+ // DBオープン
72
+ DB.open();
73
+
74
+ // リストを抽出。
75
+ if (iPara_customer_id <= 0) {
76
+ // iPara_customer_id <= 0 の時は、パターンや抽出条件にcustomer_idを入れない。
77
+ String strSQL =
78
+ "SELECT *"
79
+ + " FROM commpany_list"
80
+ + " WHERE"
81
+ + " id IN"
82
+ + " (SELECT MAX(id)"
83
+ + " FROM commpany_list"
84
+ + " WHERE"
85
+ + " (company_id = " + iPara_company_id + ")" // 会社ID
86
+ + " AND (user_id = " + iPara_user_id + ")" // ユーザーID
87
+ + " AND (delete_flag = false)" // 削除フラグ
88
+ + " GROUP BY index_id, company_id, user_id)"
89
+ + " ORDER BY write_datetime DESC";
90
+
91
+ // SELECT用のSQL実行メソッド
92
+ DB.executeQuery(strSQL);
93
+ }
94
+ else {
95
+ String strSQL =
96
+ "SELECT *"
97
+ + " FROM commpany_list"
98
+ + " WHERE"
99
+ + " id IN"
100
+ + " (SELECT MAX(id)"
101
+ + " FROM commpany_list"
102
+ + " WHERE"
103
+ + " (company_id = " + iPara_company_id + ")" // 会社ID
104
+ + " AND (user_id = " + iPara_user_id + ")" // ユーザーID
105
+ + " AND (customer_id = " + iPara_customer_id + ")" // 顧客ID
106
+ + " AND (delete_flag = false)" // 削除フラグ
107
+ + " GROUP BY index_id, company_id, customer_id, user_id)"
108
+ + " ORDER BY write_datetime DESC";
109
+
110
+ // SELECT用のSQL実行メソッド
111
+ DB.executeQuery(strSQL);
112
+ }
113
+ 以下省略
114
+ }
115
+ catch(・・・
116
+ }
117
+
118
+ 以上

11

誤記修正

2015/08/22 00:22

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -55,5 +55,5 @@
55
55
  + " AND (user_id = " + iPara_user_id + ")" // ユーザーID
56
56
  + " AND (customer_id = " + iPara_customer_id + ")" // 社員ID
57
57
  + " AND (delete_flag = false)" // 削除フラグ
58
- + " GROUP BY commpany_no, commpany_id, customer_id, user_id)"
58
+ + " GROUP BY index_id, commpany_id, customer_id, user_id)"
59
59
  + " ORDER BY write_datetime DESC";

10

テーブル構造のお詫び

2015/08/22 00:11

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -33,6 +33,10 @@
33
33
  10 5 1 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出
34
34
 
35
35
  ※idは、プライマリーキー。
36
+ ※DB構造が同じパターンの値が複数あり、無駄なつくりに見えるかもしれませんが、
37
+ 仕様書との観点から、他DB用SQLからのJOINや呼び出しで利便性を高めた結果、
38
+ このような意見すると無駄に見えるパターンになっております。
39
+ (熟練者の方なら、もっと良いテーブルがすぐに作れるのは承知しております)
36
40
 
37
41
 
38
42
  ■8/2 19:57 追記:

9

レコード例を増やした

2015/08/22 00:05

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -18,6 +18,7 @@
18
18
  尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
19
19
 
20
20
  ※iPara_company_id=1、iPara_user_id=1、iPara_customar_id=1など関数に渡す引数に一致したレコードだけ抽出したい。
21
+
21
22
  ■テーブルの例
22
23
  id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
23
24
  1 3 3 1 1 2015-08-01 15:11:23
@@ -28,6 +29,8 @@
28
29
  6 2 1 1 1 2015-08-06 13:11:11 ←最終日時のこれを抽出
29
30
  7 4 5 1 1 2015-08-08 15:11:23
30
31
  8 4 5 1 1 2015-08-08 16:12:11
32
+ 9 5 1 1 1 2015-08-08 15:11:23
33
+ 10 5 1 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出
31
34
 
32
35
  ※idは、プライマリーキー。
33
36
 

8

iPara_

2015/08/21 13:03

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -17,8 +17,8 @@
17
17
 
18
18
  尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
19
19
 
20
-
21
- ■テーブルの例 iPara_~は、関数に渡す引数で、これに一致したレコードだけ抽出したい。
20
+ iPara_company_id=1iPara_user_id=1、iPara_customar_id=1など関数に渡す引数に一致したレコードだけ抽出したい。
21
+ ■テーブルの例
22
22
  id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
23
23
  1 3 3 1 1 2015-08-01 15:11:23
24
24
  2 1 1 1 1 2015-08-02 13:11:11

7

テーブル例を追記

2015/08/21 13:01

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -20,14 +20,14 @@
20
20
 
21
21
  ■テーブルの例 ※iPara_~は、関数に渡す引数で、これに一致したレコードだけ抽出したい。
22
22
  id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
23
- 1 1 1 1 2 2015-08-01 15:11:23
23
+ 1 3 3 1 1 2015-08-01 15:11:23
24
- 2 1 1 1 2 2015-08-02 13:11:11
24
+ 2 1 1 1 1 2015-08-02 13:11:11
25
- 3 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出
25
+ 3 1 1 1 1 2015-08-03 09: 31:21 ←最終日時のこれを抽出
26
- 4 2 5 1 1 2015-08-04 13:11:11
26
+ 4 2 1 1 1 2015-08-04 13:11:11
27
- 5 2 5 1 1 2015-08-05 15:11:23
27
+ 5 2 1 1 1 2015-08-05 15:11:23
28
- 6 2 5 1 1 2015-08-06 13:11:11
28
+ 6 2 1 1 1 2015-08-06 13:11:11 ←最終日時のこれを抽出
29
- 7 2 5 1 1 2015-08-08 15:11:23
29
+ 7 4 5 1 1 2015-08-08 15:11:23
30
- 8 2 5 1 1 2015-08-08 16:12:11
30
+ 8 4 5 1 1 2015-08-08 16:12:11
31
31
 
32
32
  ※idは、プライマリーキー。
33
33
 

6

引数の重要性

2015/08/21 12:56

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -9,25 +9,25 @@
9
9
  会社ID+社員ID+顧客IDの、各IDに該当するレコードが複数抽出されてしまいますが、
10
10
 
11
11
  抽出したいのは、
12
+ 関数の引数の 会社ID、社員ID、顧客IDに一致した、
12
13
  会社ID+社員ID+顧客IDで、write_datetimeが一番大きい レコード。のパターンを全件抽出したいのです。
13
14
 
14
15
 
15
- ※iPara_~は、関数に渡す引数。
16
16
 
17
17
 
18
18
  尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
19
19
 
20
20
 
21
- ■テーブルの例
21
+ ■テーブルの例 ※iPara_~は、関数に渡す引数で、これに一致したレコードだけ抽出したい。
22
- id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
22
+ id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
23
23
  1 1 1 1 2 2015-08-01 15:11:23
24
24
  2 1 1 1 2 2015-08-02 13:11:11
25
- 3 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出したい
25
+ 3 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出
26
26
  4 2 5 1 1 2015-08-04 13:11:11
27
27
  5 2 5 1 1 2015-08-05 15:11:23
28
28
  6 2 5 1 1 2015-08-06 13:11:11
29
29
  7 2 5 1 1 2015-08-08 15:11:23
30
- 8 2 5 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出したい
30
+ 8 2 5 1 1 2015-08-08 16:12:11
31
31
 
32
32
  ※idは、プライマリーキー。
33
33
 

5

SQL文追加。

2015/08/21 12:53

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -14,25 +14,11 @@
14
14
 
15
15
  ※iPara_~は、関数に渡す引数。
16
16
 
17
- "SELECT * FROM commpany_list"
18
- + " WHERE"
19
- + " (company_id = " + iPara_company_id + ")" // 会社ID
20
- + " AND (user_id = " + iPara_user_id + ")" // 社員ID
21
- + " AND (customar_id = " + iPara_customar_id + ")" // 顧客ID
22
- + " AND (delete_flag = false)" // 削除フラグ
23
- + " ORDER BY write_datetime DESC" // 書き込んだ年月日の逆順で抽出
24
- + " LIMIT " + MAX_DATA_LIST;
25
17
 
26
-
27
-
28
18
  尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
29
19
 
30
- ですので、下記で、実現できないか、やってみたのですが、シンタックスエラーになってしまいます。
31
- "SELECT *, MAX(write_datetime), DISTINCT index_no FROM commpany_list"
32
- + " WHERE"
33
- 省略
34
20
 
35
-
21
+ ■テーブルの例
36
22
  id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
37
23
  1 1 1 1 2 2015-08-01 15:11:23
38
24
  2 1 1 1 2 2015-08-02 13:11:11
@@ -43,4 +29,24 @@
43
29
  7 2 5 1 1 2015-08-08 15:11:23
44
30
  8 2 5 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出したい
45
31
 
46
- ※idは、プライマリーキー。
32
+ ※idは、プライマリーキー。
33
+
34
+
35
+ ■8/2 19:57 追記:
36
+ 下記SQL文を作ったのですが、GROUP BYでレコードは、ユニークに抽出できているのですが、
37
+ 最大日付(write_datetime)を拾ってこない状態です。
38
+
39
+ String strSQL =
40
+ "SELECT *"
41
+ + " FROM commpany_list"
42
+ + " WHERE"
43
+ + " id IN"
44
+ + " (SELECT MAX(id)"
45
+ + " FROM commpany_list"
46
+ + " WHERE"
47
+ + " (company_id = " + iPara_company_id + ")" // 会社ID
48
+ + " AND (user_id = " + iPara_user_id + ")" // ユーザーID
49
+ + " AND (customer_id = " + iPara_customer_id + ")" // 社員ID
50
+ + " AND (delete_flag = false)" // 削除フラグ
51
+ + " GROUP BY commpany_no, commpany_id, customer_id, user_id)"
52
+ + " ORDER BY write_datetime DESC";

4

プライマリーキー追加。

2015/08/21 11:02

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -33,12 +33,14 @@
33
33
  省略
34
34
 
35
35
 
36
- index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
36
+ id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
37
- 1 1 1 2 2015-08-01 15:11:23
37
+ 1 1 1 1 2 2015-08-01 15:11:23
38
- 1 1 1 2 2015-08-02 13:11:11
38
+ 2 1 1 1 2 2015-08-02 13:11:11
39
- 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出したい
39
+ 3 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出したい
40
- 2 5 1 1 2015-08-04 13:11:11
40
+ 4 2 5 1 1 2015-08-04 13:11:11
41
- 2 5 1 1 2015-08-05 15:11:23
41
+ 5 2 5 1 1 2015-08-05 15:11:23
42
- 2 5 1 1 2015-08-06 13:11:11
42
+ 6 2 5 1 1 2015-08-06 13:11:11
43
- 2 5 1 1 2015-08-08 15:11:23
43
+ 7 2 5 1 1 2015-08-08 15:11:23
44
- 2 5 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出したい
44
+ 8 2 5 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出したい
45
+
46
+ ※idは、プライマリーキー。

3

レコード例追加

2015/08/21 10:52

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -30,4 +30,15 @@
30
30
  ですので、下記で、実現できないか、やってみたのですが、シンタックスエラーになってしまいます。
31
31
  "SELECT *, MAX(write_datetime), DISTINCT index_no FROM commpany_list"
32
32
  + " WHERE"
33
- 省略
33
+ 省略
34
+
35
+
36
+ index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
37
+ 1 1 1 2 2015-08-01 15:11:23
38
+ 1 1 1 2 2015-08-02 13:11:11
39
+ 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出したい
40
+ 2 5 1 1 2015-08-04 13:11:11
41
+ 2 5 1 1 2015-08-05 15:11:23
42
+ 2 5 1 1 2015-08-06 13:11:11
43
+ 2 5 1 1 2015-08-08 15:11:23
44
+ 2 5 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出したい

2

DISTINCT

2015/08/21 04:51

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -11,16 +11,23 @@
11
11
  抽出したいのは、
12
12
  会社ID+社員ID+顧客IDで、write_datetimeが一番大きい レコード。のパターンを全件抽出したいのです。
13
13
 
14
- 尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
15
14
 
16
-
17
15
  ※iPara_~は、関数に渡す引数。
18
16
 
19
- "SELECT * FROM consultation_list"
17
+ "SELECT * FROM commpany_list"
20
18
  + " WHERE"
21
19
  + " (company_id = " + iPara_company_id + ")" // 会社ID
22
20
  + " AND (user_id = " + iPara_user_id + ")" // 社員ID
23
21
  + " AND (customar_id = " + iPara_customar_id + ")" // 顧客ID
24
22
  + " AND (delete_flag = false)" // 削除フラグ
25
23
  + " ORDER BY write_datetime DESC" // 書き込んだ年月日の逆順で抽出
26
- + " LIMIT " + MAX_DATA_LIST;
24
+ + " LIMIT " + MAX_DATA_LIST;
25
+
26
+
27
+
28
+ 尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
29
+
30
+ ですので、下記で、実現できないか、やってみたのですが、シンタックスエラーになってしまいます。
31
+ "SELECT *, MAX(write_datetime), DISTINCT index_no FROM commpany_list"
32
+ + " WHERE"
33
+ 省略

1

いんでx

2015/08/21 04:42

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -11,7 +11,9 @@
11
11
  抽出したいのは、
12
12
  会社ID+社員ID+顧客IDで、write_datetimeが一番大きい レコード。のパターンを全件抽出したいのです。
13
13
 
14
+ 尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
14
15
 
16
+
15
17
  ※iPara_~は、関数に渡す引数。
16
18
 
17
19
  "SELECT * FROM consultation_list"