質問編集履歴
4
結論の追記
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
誤字修正・少し追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -10,11 +10,11 @@
|
|
10
10
|
**【やりたいこと】**
|
11
11
|
まず、`data_table` テーブルに `foo` と `bar` のカラムがあり、
|
12
12
|
以下のようにデータが入っているとします。
|
13
|
-
`
|
13
|
+
`buz` その他のデータも入っています。
|
14
14
|
PKは `foo` と `bar` の複合です。
|
15
15
|
|
16
16
|
------
|
17
|
-
foo bar
|
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
|
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`.`
|
47
|
+
`dt`.`foo`, `dt`.`bar`, `dt`.`buz`
|
48
48
|
FROM
|
49
49
|
(
|
50
|
-
SELECT `foo`, `bar`, `
|
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
全体的に加筆しました
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
補足情報の追加
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
|
動作は保証されない書き方のはずです。
|