回答編集履歴

2

SQLのコメントを追記

2015/08/28 01:03

投稿

kutsulog
kutsulog

スコア985

test CHANGED
@@ -21,6 +21,8 @@
21
21
  FROM tb_items SRC
22
22
 
23
23
  JOIN tb_filter_keyword FIL
24
+
25
+ /* フィルタで指定されたカラムにキーワードが含まれることのチェック */
24
26
 
25
27
  ON FIL.Type = 'Name' AND locate(FIL.Keyword, SRC.Name) > 0
26
28
 
@@ -58,6 +60,8 @@
58
60
 
59
61
  ID
60
62
 
63
+ /* 最大値が0(フィルタにデータかかかっていない)場合にFALSE,それ以外はTRUEを設定 */
64
+
61
65
  , CASE WHEN MAX(TMP.INC) = 0 THEN FALSE ELSE TRUE END Status
62
66
 
63
67
  FROM (
@@ -66,11 +70,15 @@
66
70
 
67
71
  ID
68
72
 
73
+ /* フィルタに引っかかったデータIDに1を設定 */
74
+
69
75
  , 1 INC
70
76
 
71
77
  FROM tb_items SRC
72
78
 
73
79
  JOIN tb_filter_keyword FIL
80
+
81
+ /* フィルタで指定されたカラムにキーワードが含まれることのチェック */
74
82
 
75
83
  ON FIL.Type = 'Name' AND locate(FIL.Keyword, SRC.Name) > 0
76
84
 
@@ -83,6 +91,8 @@
83
91
  SELECT
84
92
 
85
93
  ID
94
+
95
+ /* すべてのIDでデータが見つからない場合の初期値(0)を設定 */
86
96
 
87
97
  , 0
88
98
 

1

UPDATEを1回で行うSQLを追加

2015/08/28 01:03

投稿

kutsulog
kutsulog

スコア985

test CHANGED
@@ -35,3 +35,69 @@
35
35
 
36
36
 
37
37
  ```
38
+
39
+
40
+
41
+ ---
42
+
43
+
44
+
45
+ UPDATE一回で済ませたいならこちら
46
+
47
+
48
+
49
+ ```SQL
50
+
51
+ UPDATE tb_items
52
+
53
+ SET Status = TMP2.Status
54
+
55
+ FROM (
56
+
57
+ SELECT
58
+
59
+ ID
60
+
61
+ , CASE WHEN MAX(TMP.INC) = 0 THEN FALSE ELSE TRUE END Status
62
+
63
+ FROM (
64
+
65
+ SELECT
66
+
67
+ ID
68
+
69
+ , 1 INC
70
+
71
+ FROM tb_items SRC
72
+
73
+ JOIN tb_filter_keyword FIL
74
+
75
+ ON FIL.Type = 'Name' AND locate(FIL.Keyword, SRC.Name) > 0
76
+
77
+ OR FIL.Type = 'Brand' AND locate(FIL.Keyword, SRC.Brand) > 0
78
+
79
+ OR FIL.Type = 'Category' AND locate(FIL.keyword, SRC.Category) > 0
80
+
81
+ UNION ALL
82
+
83
+ SELECT
84
+
85
+ ID
86
+
87
+ , 0
88
+
89
+ FROM tb_items
90
+
91
+ ) TMP
92
+
93
+ GROUP BY
94
+
95
+ ID
96
+
97
+ ) TMP2
98
+
99
+ WHERE ID = TMP2.ID
100
+
101
+
102
+
103
+ ```