質問編集履歴

17

解決

2015/08/22 04:27

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -329,3 +329,41 @@
329
329
 
330
330
 
331
331
  以上
332
+
333
+
334
+
335
+
336
+
337
+ ■追記:8/22 13:25
338
+
339
+ 上記「①」の抽出ができました。
340
+
341
+
342
+
343
+ String strSQL = "SELECT * FROM commpany_list AS m"
344
+
345
+ + "WHERE m.delete_flag = false"
346
+
347
+ + "AND m.company_id = " + iPara_company_id
348
+
349
+ + "AND m.user_id = " + iPara_user_id
350
+
351
+ //+ "AND m.customar_id = " + iPara_customar_id ← ここをコメントアウトしただけ。
352
+
353
+ + "AND NOT EXISTS ("
354
+
355
+ + " SELECT 1 FROM commpany_list AS s"
356
+
357
+ + " WHERE m.index_id = s.index_id"
358
+
359
+ + " AND m.delete_flag = false"
360
+
361
+ + " AND m.write_datetime < s.write_datetime"
362
+
363
+ + ")"
364
+
365
+ + "ORDER BY m.write_datetime DESC";
366
+
367
+
368
+
369
+ 以上

16

「①」のパターンを追加

2015/08/22 04:27

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
 
43
- ■テーブルの例
43
+ ■テーブルの例 ※後記「②」のパターンをわかりやすくしたテーブル例。
44
44
 
45
45
  id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
46
46
 
@@ -273,3 +273,59 @@
273
273
  + ")"
274
274
 
275
275
  + "ORDER BY m.write_datetime DESC";
276
+
277
+
278
+
279
+ -------------------------------------------------------
280
+
281
+
282
+
283
+ 「①」のパターンのテーブル例。
284
+
285
+ ■テーブルの例 ※上記「①」のパターンをわかりやすくしたテーブル例。
286
+
287
+ id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
288
+
289
+ 1 1 1 1 0 2015-08-01 15:11:23
290
+
291
+ 2 1 1 1 0 2015-08-02 13:11:11
292
+
293
+ 3 1 1 1 0 2015-08-03 09: 31:21 ←最終日時のこれを抽出
294
+
295
+ 4 2 1 1 0 2015-08-04 13:11:11
296
+
297
+ 5 2 1 1 0 2015-08-05 15:11:23
298
+
299
+ 6 2 1 1 0 2015-08-06 13:11:11 ←最終日時のこれを抽出
300
+
301
+ 7 4 5 1 0 2015-08-08 15:11:23
302
+
303
+ 8 4 5 1 0 2015-08-08 16:12:11
304
+
305
+ 9 5 1 1 0 2015-08-08 15:11:23
306
+
307
+ 10 5 1 1 0 2015-08-08 16:12:11 ←最終日時のこれを抽出
308
+
309
+ 11 6 3 1 1 2015-08-01 15:11:23
310
+
311
+ 12 7 1 1 1 2015-08-02 13:11:11
312
+
313
+ 13 7 1 1 1 2015-08-03 09: 31:21 ←最終日時のこれを抽出
314
+
315
+ 14 8 1 1 1 2015-08-04 13:11:11
316
+
317
+ 15 8 1 1 1 2015-08-05 15:11:23
318
+
319
+ 16 8 1 1 1 2015-08-06 13:11:11 ←最終日時のこれを抽出
320
+
321
+ 17 9 5 1 1 2015-08-08 15:11:23
322
+
323
+ 18 9 5 1 1 2015-08-08 16:12:11
324
+
325
+ 19 10 1 1 1 2015-08-08 15:11:23
326
+
327
+ 20 10 1 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出
328
+
329
+
330
+
331
+ 以上

15

②解決

2015/08/22 02:41

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -237,3 +237,39 @@
237
237
 
238
238
 
239
239
  以上
240
+
241
+
242
+
243
+
244
+
245
+ ■追記: 8/22 11:31
246
+
247
+ 下記SQLで、「②」のパターンが正常に抽出でき、解決。
248
+
249
+ あとは、「①」のパターンの抽出のSQL。
250
+
251
+
252
+
253
+ String strSQL = "SELECT * FROM commpany_list AS m"
254
+
255
+ + "WHERE m.delete_flag = false"
256
+
257
+ + "AND m.company_id = " + iPara_company_id
258
+
259
+ + "AND m.user_id = " + iPara_user_id
260
+
261
+ + "AND m.customar_id = " + iPara_customar_id
262
+
263
+ + "AND NOT EXISTS ("
264
+
265
+ + " SELECT 1 FROM commpany_list AS s"
266
+
267
+ + " WHERE m.index_id = s.index_id"
268
+
269
+ + " AND m.delete_flag = false"
270
+
271
+ + " AND m.write_datetime < s.write_datetime"
272
+
273
+ + ")"
274
+
275
+ + "ORDER BY m.write_datetime DESC";

14

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

2015/08/22 02:32

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -148,6 +148,8 @@
148
148
 
149
149
  if (iPara_customer_id <= 0) {
150
150
 
151
+ // ★★★①のパターン★★★
152
+
151
153
  **// iPara_customer_id <= 0 の時は、パターンや抽出条件にcustomer_idを入れない。**
152
154
 
153
155
  String strSQL =
@@ -186,6 +188,8 @@
186
188
 
187
189
  else {
188
190
 
191
+ // ★★★②のパターン★★★
192
+
189
193
  String strSQL =
190
194
 
191
195
  "SELECT *"

13

BOLD

2015/08/22 02:30

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -148,7 +148,7 @@
148
148
 
149
149
  if (iPara_customer_id <= 0) {
150
150
 
151
- // iPara_customer_id <= 0 の時は、パターンや抽出条件にcustomer_idを入れない。
151
+ **// iPara_customer_id <= 0 の時は、パターンや抽出条件にcustomer_idを入れない。**
152
152
 
153
153
  String strSQL =
154
154
 

12

ソース例掲載

2015/08/22 00:25

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -115,3 +115,121 @@
115
115
  + " GROUP BY index_id, commpany_id, customer_id, user_id)"
116
116
 
117
117
  + " ORDER BY write_datetime DESC";
118
+
119
+
120
+
121
+
122
+
123
+ ■8/22 9:18 S_Minecraft様のご要望で、関数へパラメーターを渡す部分を含めたソースを掲載。
124
+
125
+
126
+
127
+ public int getAllCompany_Pattern_List(
128
+
129
+ int iPara_company_id
130
+
131
+ , int iPara_user_id
132
+
133
+ , int iPara_customer_id
134
+
135
+ )
136
+
137
+ {
138
+
139
+ try {
140
+
141
+ // DBオープン
142
+
143
+ DB.open();
144
+
145
+
146
+
147
+ // リストを抽出。
148
+
149
+ if (iPara_customer_id <= 0) {
150
+
151
+ // iPara_customer_id <= 0 の時は、パターンや抽出条件にcustomer_idを入れない。
152
+
153
+ String strSQL =
154
+
155
+ "SELECT *"
156
+
157
+ + " FROM commpany_list"
158
+
159
+ + " WHERE"
160
+
161
+ + " id IN"
162
+
163
+ + " (SELECT MAX(id)"
164
+
165
+ + " FROM commpany_list"
166
+
167
+ + " WHERE"
168
+
169
+ + " (company_id = " + iPara_company_id + ")" // 会社ID
170
+
171
+ + " AND (user_id = " + iPara_user_id + ")" // ユーザーID
172
+
173
+ + " AND (delete_flag = false)" // 削除フラグ
174
+
175
+ + " GROUP BY index_id, company_id, user_id)"
176
+
177
+ + " ORDER BY write_datetime DESC";
178
+
179
+
180
+
181
+ // SELECT用のSQL実行メソッド
182
+
183
+ DB.executeQuery(strSQL);
184
+
185
+ }
186
+
187
+ else {
188
+
189
+ String strSQL =
190
+
191
+ "SELECT *"
192
+
193
+ + " FROM commpany_list"
194
+
195
+ + " WHERE"
196
+
197
+ + " id IN"
198
+
199
+ + " (SELECT MAX(id)"
200
+
201
+ + " FROM commpany_list"
202
+
203
+ + " WHERE"
204
+
205
+ + " (company_id = " + iPara_company_id + ")" // 会社ID
206
+
207
+ + " AND (user_id = " + iPara_user_id + ")" // ユーザーID
208
+
209
+ + " AND (customer_id = " + iPara_customer_id + ")" // 顧客ID
210
+
211
+ + " AND (delete_flag = false)" // 削除フラグ
212
+
213
+ + " GROUP BY index_id, company_id, customer_id, user_id)"
214
+
215
+ + " ORDER BY write_datetime DESC";
216
+
217
+
218
+
219
+ // SELECT用のSQL実行メソッド
220
+
221
+ DB.executeQuery(strSQL);
222
+
223
+ }
224
+
225
+ 以下省略
226
+
227
+ }
228
+
229
+ catch(・・・
230
+
231
+ }
232
+
233
+
234
+
235
+ 以上

11

誤記修正

2015/08/22 00:22

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -112,6 +112,6 @@
112
112
 
113
113
  + " AND (delete_flag = false)" // 削除フラグ
114
114
 
115
- + " GROUP BY commpany_no, commpany_id, customer_id, user_id)"
115
+ + " GROUP BY index_id, commpany_id, customer_id, user_id)"
116
116
 
117
117
  + " ORDER BY write_datetime DESC";

10

テーブル構造のお詫び

2015/08/22 00:11

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -68,6 +68,14 @@
68
68
 
69
69
  ※idは、プライマリーキー。
70
70
 
71
+ ※DB構造が同じパターンの値が複数あり、無駄なつくりに見えるかもしれませんが、
72
+
73
+ 仕様書との観点から、他DB用SQLからのJOINや呼び出しで利便性を高めた結果、
74
+
75
+ このような意見すると無駄に見えるパターンになっております。
76
+
77
+ (熟練者の方なら、もっと良いテーブルがすぐに作れるのは承知しております)
78
+
71
79
 
72
80
 
73
81
 

9

レコード例を増やした

2015/08/22 00:05

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -38,6 +38,8 @@
38
38
 
39
39
  ※iPara_company_id=1、iPara_user_id=1、iPara_customar_id=1など関数に渡す引数に一致したレコードだけ抽出したい。
40
40
 
41
+
42
+
41
43
  ■テーブルの例
42
44
 
43
45
  id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
@@ -57,6 +59,10 @@
57
59
  7 4 5 1 1 2015-08-08 15:11:23
58
60
 
59
61
  8 4 5 1 1 2015-08-08 16:12:11
62
+
63
+ 9 5 1 1 1 2015-08-08 15:11:23
64
+
65
+ 10 5 1 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出
60
66
 
61
67
 
62
68
 

8

iPara_

2015/08/21 13:03

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -36,9 +36,9 @@
36
36
 
37
37
 
38
38
 
39
+ ※iPara_company_id=1、iPara_user_id=1、iPara_customar_id=1など関数に渡す引数に一致したレコードだけ抽出したい。
39
40
 
40
-
41
- ■テーブルの例 ※iPara_~は、関数に渡す引数で、これに一致したレコードだけ抽出したい。
41
+ ■テーブルの例
42
42
 
43
43
  id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
44
44
 

7

テーブル例を追記

2015/08/21 13:01

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -42,21 +42,21 @@
42
42
 
43
43
  id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
44
44
 
45
- 1 1 1 1 2 2015-08-01 15:11:23
45
+ 1 3 3 1 1 2015-08-01 15:11:23
46
46
 
47
- 2 1 1 1 2 2015-08-02 13:11:11
47
+ 2 1 1 1 1 2015-08-02 13:11:11
48
48
 
49
- 3 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出
49
+ 3 1 1 1 1 2015-08-03 09: 31:21 ←最終日時のこれを抽出
50
50
 
51
- 4 2 5 1 1 2015-08-04 13:11:11
51
+ 4 2 1 1 1 2015-08-04 13:11:11
52
52
 
53
- 5 2 5 1 1 2015-08-05 15:11:23
53
+ 5 2 1 1 1 2015-08-05 15:11:23
54
54
 
55
- 6 2 5 1 1 2015-08-06 13:11:11
55
+ 6 2 1 1 1 2015-08-06 13:11:11 ←最終日時のこれを抽出
56
56
 
57
- 7 2 5 1 1 2015-08-08 15:11:23
57
+ 7 4 5 1 1 2015-08-08 15:11:23
58
58
 
59
- 8 2 5 1 1 2015-08-08 16:12:11
59
+ 8 4 5 1 1 2015-08-08 16:12:11
60
60
 
61
61
 
62
62
 

6

引数の重要性

2015/08/21 12:56

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -20,13 +20,13 @@
20
20
 
21
21
  抽出したいのは、
22
22
 
23
+ 関数の引数の 会社ID、社員ID、顧客IDに一致した、
24
+
23
25
  会社ID+社員ID+顧客IDで、write_datetimeが一番大きい レコード。のパターンを全件抽出したいのです。
24
26
 
25
27
 
26
28
 
27
29
 
28
-
29
- ※iPara_~は、関数に渡す引数。
30
30
 
31
31
 
32
32
 
@@ -38,15 +38,15 @@
38
38
 
39
39
 
40
40
 
41
- ■テーブルの例
41
+ ■テーブルの例 ※iPara_~は、関数に渡す引数で、これに一致したレコードだけ抽出したい。
42
42
 
43
- id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
43
+ id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
44
44
 
45
45
  1 1 1 1 2 2015-08-01 15:11:23
46
46
 
47
47
  2 1 1 1 2 2015-08-02 13:11:11
48
48
 
49
- 3 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出したい
49
+ 3 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出
50
50
 
51
51
  4 2 5 1 1 2015-08-04 13:11:11
52
52
 
@@ -56,7 +56,7 @@
56
56
 
57
57
  7 2 5 1 1 2015-08-08 15:11:23
58
58
 
59
- 8 2 5 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出したい
59
+ 8 2 5 1 1 2015-08-08 16:12:11
60
60
 
61
61
 
62
62
 

5

SQL文追加。

2015/08/21 12:53

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -30,43 +30,15 @@
30
30
 
31
31
 
32
32
 
33
- "SELECT * FROM commpany_list"
34
-
35
- + " WHERE"
36
-
37
- + " (company_id = " + iPara_company_id + ")" // 会社ID
38
-
39
- + " AND (user_id = " + iPara_user_id + ")" // 社員ID
40
-
41
- + " AND (customar_id = " + iPara_customar_id + ")" // 顧客ID
42
-
43
- + " AND (delete_flag = false)" // 削除フラグ
44
-
45
- + " ORDER BY write_datetime DESC" // 書き込んだ年月日の逆順で抽出
46
-
47
- + " LIMIT " + MAX_DATA_LIST;
48
-
49
-
50
-
51
-
52
-
53
33
 
54
34
 
55
35
  尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
56
36
 
57
37
 
58
38
 
59
- ですので、下記で、実現できないか、やってみたのですが、シンタックスエラーになってしまいます。
60
-
61
- "SELECT *, MAX(write_datetime), DISTINCT index_no FROM commpany_list"
62
-
63
- + " WHERE"
64
-
65
- 省略
66
39
 
67
40
 
68
-
41
+ ■テーブルの例
69
-
70
42
 
71
43
  id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
72
44
 
@@ -89,3 +61,43 @@
89
61
 
90
62
 
91
63
  ※idは、プライマリーキー。
64
+
65
+
66
+
67
+
68
+
69
+ ■8/2 19:57 追記:
70
+
71
+ 下記SQL文を作ったのですが、GROUP BYでレコードは、ユニークに抽出できているのですが、
72
+
73
+ 最大日付(write_datetime)を拾ってこない状態です。
74
+
75
+
76
+
77
+ String strSQL =
78
+
79
+ "SELECT *"
80
+
81
+ + " FROM commpany_list"
82
+
83
+ + " WHERE"
84
+
85
+ + " id IN"
86
+
87
+ + " (SELECT MAX(id)"
88
+
89
+ + " FROM commpany_list"
90
+
91
+ + " WHERE"
92
+
93
+ + " (company_id = " + iPara_company_id + ")" // 会社ID
94
+
95
+ + " AND (user_id = " + iPara_user_id + ")" // ユーザーID
96
+
97
+ + " AND (customer_id = " + iPara_customer_id + ")" // 社員ID
98
+
99
+ + " AND (delete_flag = false)" // 削除フラグ
100
+
101
+ + " GROUP BY commpany_no, commpany_id, customer_id, user_id)"
102
+
103
+ + " ORDER BY write_datetime DESC";

4

プライマリーキー追加。

2015/08/21 11:02

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -68,20 +68,24 @@
68
68
 
69
69
 
70
70
 
71
- index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
71
+ id index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
72
72
 
73
- 1 1 1 2 2015-08-01 15:11:23
73
+ 1 1 1 1 2 2015-08-01 15:11:23
74
74
 
75
- 1 1 1 2 2015-08-02 13:11:11
75
+ 2 1 1 1 2 2015-08-02 13:11:11
76
76
 
77
- 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出したい
77
+ 3 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出したい
78
78
 
79
- 2 5 1 1 2015-08-04 13:11:11
79
+ 4 2 5 1 1 2015-08-04 13:11:11
80
80
 
81
- 2 5 1 1 2015-08-05 15:11:23
81
+ 5 2 5 1 1 2015-08-05 15:11:23
82
82
 
83
- 2 5 1 1 2015-08-06 13:11:11
83
+ 6 2 5 1 1 2015-08-06 13:11:11
84
84
 
85
- 2 5 1 1 2015-08-08 15:11:23
85
+ 7 2 5 1 1 2015-08-08 15:11:23
86
86
 
87
- 2 5 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出したい
87
+ 8 2 5 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出したい
88
+
89
+
90
+
91
+ ※idは、プライマリーキー。

3

レコード例追加

2015/08/21 10:52

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -63,3 +63,25 @@
63
63
  + " WHERE"
64
64
 
65
65
  省略
66
+
67
+
68
+
69
+
70
+
71
+ index_id company_id user_id customar_id write_datetime ・ ・・その他多数の項目
72
+
73
+ 1 1 1 2 2015-08-01 15:11:23
74
+
75
+ 1 1 1 2 2015-08-02 13:11:11
76
+
77
+ 1 1 1 2 2015-08-03 09: 31:21 ←最終日時のこれを抽出したい
78
+
79
+ 2 5 1 1 2015-08-04 13:11:11
80
+
81
+ 2 5 1 1 2015-08-05 15:11:23
82
+
83
+ 2 5 1 1 2015-08-06 13:11:11
84
+
85
+ 2 5 1 1 2015-08-08 15:11:23
86
+
87
+ 2 5 1 1 2015-08-08 16:12:11 ←最終日時のこれを抽出したい

2

DISTINCT

2015/08/21 04:51

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -24,17 +24,13 @@
24
24
 
25
25
 
26
26
 
27
- 尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
28
-
29
-
30
-
31
27
 
32
28
 
33
29
  ※iPara_~は、関数に渡す引数。
34
30
 
35
31
 
36
32
 
37
- "SELECT * FROM consultation_list"
33
+ "SELECT * FROM commpany_list"
38
34
 
39
35
  + " WHERE"
40
36
 
@@ -49,3 +45,21 @@
49
45
  + " ORDER BY write_datetime DESC" // 書き込んだ年月日の逆順で抽出
50
46
 
51
47
  + " LIMIT " + MAX_DATA_LIST;
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+ 尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
56
+
57
+
58
+
59
+ ですので、下記で、実現できないか、やってみたのですが、シンタックスエラーになってしまいます。
60
+
61
+ "SELECT *, MAX(write_datetime), DISTINCT index_no FROM commpany_list"
62
+
63
+ + " WHERE"
64
+
65
+ 省略

1

いんでx

2015/08/21 04:42

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -24,6 +24,10 @@
24
24
 
25
25
 
26
26
 
27
+ 尚、各レコードには、会社ID+社員ID+顧客IDの組み合わせで、ユニークな index_id を持っています。
28
+
29
+
30
+
27
31
 
28
32
 
29
33
  ※iPara_~は、関数に渡す引数。