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

回答編集履歴

5

推敲

2020/08/15 04:52

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -26,17 +26,17 @@
26
26
  最終形が良く分からないので、上記条件に合わせてpostsを取得するとすると以下の様な記述になります。
27
27
  ```SQL
28
28
  select * from posts
29
- where post_kind = 1 --①
29
+ where post_kind = 1 --
30
30
  and (
31
- user_id = 2 --②
31
+ user_id = 2 --
32
32
  or id in (
33
- select post_id from follows where user_id=2 --③
33
+ select post_id from follows where user_id=2 --
34
34
  union all
35
- select post_id from keeps where user_id=2 --④
35
+ select post_id from keeps where user_id=2 --
36
36
  )
37
37
  )
38
- and is_trash = 0 --⑤
38
+ and is_trash = 0 --
39
- and user_id not in ( --⑥
39
+ and user_id not in ( --
40
40
  select user_id from blocks where user_ID2=2
41
41
  union all
42
42
  select user_id2 from blocks where user_ID=2

4

追記

2020/08/15 04:51

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -9,4 +9,38 @@
9
9
 
10
10
  チューニングの前に、それらを整理する必要があると思います。
11
11
  あなたの質問はぱっと見で性能を改善したいのが目的のように見えますが、本当は意図通りに抽出できていない事に対してではありませんか?
12
- もしそうなら、もっと要件が分かるように、希望する結果をサンプルとして質問に追記して下さい。
12
+ もしそうなら、もっと要件が分かるように、希望する結果をサンプルとして質問に追記して下さい。
13
+
14
+ 追記
15
+ --
16
+ > ★ 取得条件
17
+ > ➀post_kind = 1 のもの
18
+ > AND
19
+ > 指定ユーザが ➁投稿したもの OR ➂フォローしたもの OR ➃保存したもの
20
+ >
21
+ > ☆ 除外条件
22
+ > ➄削除されたもの( is_trash=1 のもの )
23
+ > OR
24
+ > ➅ブロックした、されたユーザによるもの
25
+
26
+ 最終形が良く分からないので、上記条件に合わせてpostsを取得するとすると以下の様な記述になります。
27
+ ```SQL
28
+ select * from posts
29
+ where post_kind = 1 --①
30
+ and (
31
+ user_id = 2 --②
32
+ or id in (
33
+ select post_id from follows where user_id=2 --③
34
+ union all
35
+ select post_id from keeps where user_id=2 --④
36
+ )
37
+ )
38
+ and is_trash = 0 --⑤
39
+ and user_id not in ( --⑥
40
+ select user_id from blocks where user_ID2=2
41
+ union all
42
+ select user_id2 from blocks where user_ID=2
43
+ )
44
+ ```
45
+ これを結合条件に直したとしても、質問に記載されたSQLにはなりません。
46
+ なので、質問にあるSQLで本当に得たい結果になっているかどうかが疑問なのです。

3

推敲

2020/08/14 07:49

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -8,4 +8,5 @@
8
8
  postsの自己結合については意味不明です。一意キー同士を結合しても同じ情報しか所得出来ないのでその事に意味がありません。
9
9
 
10
10
  チューニングの前に、それらを整理する必要があると思います。
11
+ あなたの質問はぱっと見で性能を改善したいのが目的のように見えますが、本当は意図通りに抽出できていない事に対してではありませんか?
11
- の整理がついていい事も含めての質問なら、もっと要件が分かるように、希望する結果をサンプルとして質問に追記して下さい
12
+ もしなら、もっと要件が分かるように、希望する結果をサンプルとして質問に追記して下さい

2

追記

2020/08/14 04:02

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -7,4 +7,5 @@
7
7
 
8
8
  postsの自己結合については意味不明です。一意キー同士を結合しても同じ情報しか所得出来ないのでその事に意味がありません。
9
9
 
10
- チューニングの前に、それらを整理する必要があると思います。
10
+ チューニングの前に、それらを整理する必要があると思います。
11
+ その整理がついていない事も含めての質問なら、もっと要件が分かるように、希望する結果をサンプルとして質問に追記して下さい

1

推敲

2020/08/14 03:57

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  色々おかしなところがあります。
2
2
  先ずテーブルの定義において、keepsテーブルとして独立させる意味はありますか?
3
- postsはid一意なのだから、保存した日を持たせるにしてもpostsに持てば済む話だと思います。
3
+ postsはid一意なのだから、保存した日を持たせるにしてもpostsに持てば済む話だと思います。
4
4
 
5
5
  次にSQLについてですが、postsに対してblocksやfollowsは1:Nの関係ですが、joinするとpostsは複数件になりますが、そのような結果を望んでいるのでしょうか?
6
6
  post_idにつき1件としたいなら、blocksやfollowsは集計したものと結合するか、サブクエリーで1件だけ取得するようにしなければなりません。