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

質問編集履歴

4

結論の追記

2016/07/01 08:50

投稿

takushi168
takushi168

スコア228

title CHANGED
File without changes
body CHANGED
@@ -54,4 +54,25 @@
54
54
  GROUP BY `dt`.`foo`
55
55
  ```
56
56
  これを改良するか、もしくは全く別の形でも構わないのですが、
57
- 正しい書き方はありますでしょうか?
57
+ 正しい書き方はありますでしょうか?
58
+
59
+
60
+ ---
61
+ <追記>
62
+ ご回答いただいた内容を参考にさせていただき、以下の形に落ち着きそうです。
63
+ (ちょっと長ったらしいですが、実装上の諸々の都合があり…。)
64
+
65
+ ```sql
66
+ SELECT `data_table`.`foo`, `data_table`.`bar`, `data_table`.`buz`
67
+ FROM `data_table`
68
+ INNER JOIN
69
+ (
70
+ -- ここの「MAX」をアプリ側で「MIN」に書き変える場合アリ
71
+ SELECT `foo`, MAX(`bar`) AS `bar`
72
+ FROM `data_table`
73
+ WHERE `bar` IN (1,2)
74
+ GROUP BY `foo`
75
+ ) AS `dt_sub`
76
+ ON `data_table`.`foo` = `dt_sub`.`foo`
77
+ AND `data_table`.`bar` = `dt_sub`.`bar`
78
+ ```

3

誤字修正・少し追記

2016/07/01 08:50

投稿

takushi168
takushi168

スコア228

title CHANGED
File without changes
body CHANGED
@@ -10,11 +10,11 @@
10
10
  **【やりたいこと】**
11
11
  まず、`data_table` テーブルに `foo` と `bar` のカラムがあり、
12
12
  以下のようにデータが入っているとします。
13
- `baz` その他のデータも入っています。
13
+ `buz` その他のデータも入っています。
14
14
  PKは `foo` と `bar` の複合です。
15
15
 
16
16
  ------
17
- foo bar baz
17
+ foo bar buz
18
18
  ------
19
19
  A 1 aaa
20
20
  B 1 bbb
@@ -28,11 +28,11 @@
28
28
  `bar`が2であるレコード(なければ1であるレコード)」
29
29
  を取得したいのです。
30
30
  (また、ここでは1と2のうち2を優先して取る例としていますが、1と3のうち1を優先して取る、等の可能性もあります。
31
- そのあたりはアプリケーション側で制御します。)
31
+ そのあたりはアプリケーション側で制御します。クエリの書き換えもある程度可能です。
32
32
 
33
33
  このような状態ですね。
34
34
  ------
35
- foo bar baz
35
+ foo bar buz
36
36
  ------
37
37
  A 1 aaa
38
38
  B 2 ccc
@@ -44,10 +44,10 @@
44
44
  動作は保証されない書き方のはずです。
45
45
  ```sql
46
46
  SELECT
47
- `dt`.`foo`, `dt`.`bar`, `dt`.`baz`
47
+ `dt`.`foo`, `dt`.`bar`, `dt`.`buz`
48
48
  FROM
49
49
  (
50
- SELECT `foo`, `bar`, `baz`
50
+ SELECT `foo`, `bar`, `buz`
51
51
  FROM `data_table`
52
52
  ORDER BY `foo` ASC, `bar` = 2 DESC, `bar` = 1 DESC
53
53
  ) AS `dt`

2

全体的に加筆しました

2016/07/01 07:06

投稿

takushi168
takushi168

スコア228

title CHANGED
File without changes
body CHANGED
@@ -1,53 +1,53 @@
1
1
  …と言葉で書くととても分かりにくいのですが。
2
2
 
3
3
 
4
+ <追記>
5
+ 全体的に加筆修正しました。
6
+
4
7
  **【環境】**
5
8
  MySQL(5.6)
6
9
 
7
10
  **【やりたいこと】**
8
11
  まず、`data_table` テーブルに `foo` と `bar` のカラムがあり、
9
12
  以下のようにデータが入っているとします。
13
+ `baz` その他のデータも入っています。
14
+ PKは `foo` と `bar` の複合です。
10
15
 
11
- ----
16
+ ------
12
- foo bar
17
+ foo bar baz
13
- ----
18
+ ------
14
- A 1
19
+ A 1 aaa
15
- B 1
20
+ B 1 bbb
16
- B 2
21
+ B 2 ccc
17
- C 1
22
+ C 1 ddd
18
- C 2
23
+ C 2 eee
19
- ----
24
+ ------
20
25
 
21
26
  このテーブルから、
22
27
  「`foo`の値(A,B,C)それぞれについて、
23
28
  `bar`が2であるレコード(なければ1であるレコード)」
24
29
  を取得したいのです。
30
+ (また、ここでは1と2のうち2を優先して取る例としていますが、1と3のうち1を優先して取る、等の可能性もあります。
31
+ そのあたりはアプリケーション側で制御します。)
25
32
 
26
33
  このような状態ですね。
27
- ----
34
+ ------
28
- foo bar
35
+ foo bar baz
29
- ----
36
+ ------
30
- A 1
37
+ A 1 aaa
31
- B 2
38
+ B 2 ccc
32
- C 2
39
+ C 2 eee
33
- ----
40
+ ------
34
41
 
35
- <追記>
36
- すみません、情報不足でした。
37
- foo,bar以外にもカラムが存在する場合があるため、
38
- あくまでレコード全体を取得したいです。
39
- </追記>
40
-
41
-
42
42
  現在のところ、
43
43
  以下のようなクエリで一応は望むものが取得できているのですが
44
44
  動作は保証されない書き方のはずです。
45
45
  ```sql
46
46
  SELECT
47
- `dt`.`foo`, `dt`.`bar`
47
+ `dt`.`foo`, `dt`.`bar`, `dt`.`baz`
48
48
  FROM
49
49
  (
50
- SELECT `foo`, `bar`
50
+ SELECT `foo`, `bar`, `baz`
51
51
  FROM `data_table`
52
52
  ORDER BY `foo` ASC, `bar` = 2 DESC, `bar` = 1 DESC
53
53
  ) AS `dt`

1

補足情報の追加

2016/07/01 06:22

投稿

takushi168
takushi168

スコア228

title CHANGED
File without changes
body CHANGED
@@ -32,7 +32,13 @@
32
32
  C 2
33
33
  ----
34
34
 
35
+ <追記>
36
+ すみません、情報不足でした。
37
+ foo,bar以外にもカラムが存在する場合があるため、
38
+ あくまでレコード全体を取得したいです。
39
+ </追記>
35
40
 
41
+
36
42
  現在のところ、
37
43
  以下のようなクエリで一応は望むものが取得できているのですが
38
44
  動作は保証されない書き方のはずです。