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

質問編集履歴

3

追記しました

2021/02/24 17:50

投稿

ThouShaltNot
ThouShaltNot

スコア3

title CHANGED
File without changes
body CHANGED
@@ -45,4 +45,24 @@
45
45
  WHERE p.age > 100
46
46
 
47
47
  HAVING children_ids IS NOT NULL
48
- ```
48
+ ```
49
+ ###追記
50
+ `HAVING`では`WHERE`が存在するときの取得がおかしかったです。
51
+ 次のように`WHERE p.age > 1`とすると、ID=1 の子供は 2,5 だけなのに、2,5,4 が取得できてしまいました。
52
+ ```MySQL
53
+ SELECT p.ID
54
+ ,GROUP_CONCAT(c.person_ID2) AS children_ids
55
+
56
+ FROM persons p
57
+ LEFT JOIN children c ON c.person_ID = p.ID
58
+
59
+ WHERE p.age > 1
60
+
61
+ HAVING children_ids IS NOT NULL
62
+
63
+ ```
64
+ そうなると新たな疑問です。
65
+ [こちらの質問](https://teratail.com/questions/66463)で、ランキング上位の方が`GROUP BY`ではなく`HAVING`を提案されているのですが、これは間違ったご回答になるのでしょうか?
66
+
67
+ しかし的確なご回答ばかりされている方なので、とても間違いだとは思えません。
68
+ `HAVING`が良い理由を知りたいです。

2

修正

2021/02/24 17:50

投稿

ThouShaltNot
ThouShaltNot

スコア3

title CHANGED
File without changes
body CHANGED
@@ -44,5 +44,5 @@
44
44
 
45
45
  WHERE p.age > 100
46
46
 
47
- HAVING ids IS NOT NULL
47
+ HAVING children_ids IS NOT NULL
48
48
  ```

1

SELECT文一部訂正

2021/02/24 17:44

投稿

ThouShaltNot
ThouShaltNot

スコア3

title CHANGED
File without changes
body CHANGED
@@ -25,7 +25,7 @@
25
25
  ### GROUP BY による方法
26
26
  ```MySQL
27
27
  SELECT p.ID
28
- ,GROUP_CONCAT(id) AS ids
28
+ ,GROUP_CONCAT(c.person_ID2) AS children_ids
29
29
 
30
30
  FROM persons p
31
31
  LEFT JOIN children c ON c.person_ID = p.ID
@@ -37,7 +37,7 @@
37
37
  ### HAVING による方法
38
38
  ```MySQL
39
39
  SELECT p.ID
40
- ,GROUP_CONCAT(id) AS ids
40
+ ,GROUP_CONCAT(c.person_ID2) AS children_ids
41
41
 
42
42
  FROM persons p
43
43
  LEFT JOIN children c ON c.person_ID = p.ID