質問編集履歴

2

訂正

2020/12/08 00:19

投稿

premiummalts
premiummalts

スコア3

test CHANGED
File without changes
test CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
 
102
102
 
103
- post_ID=10はタグ1もタグ2も持っていますが、とりあえずタグ1を優先してみまし
103
+ 【※】post_ID=10はタグ1もタグ2も持っていますが、タグ1を優先したいです
104
104
 
105
105
 
106
106
 
@@ -234,48 +234,50 @@
234
234
 
235
235
 
236
236
 
237
- ならばと、二つをそのまま一つにまとめて、つまりunionで次のようにまとめてみれば実現できるか?と思ったのですが、惜しくも
237
+ ならばと、二つをそのまま一つにまとめて、つまりunionで次のようにまとめてみれば実現できるか?と思ったのですが…
238
-
239
-
240
-
241
-
242
-
238
+
239
+
240
+
243
- 欲しい結果とは微妙に異なりまして、ID=10について、「取得経緯のtag_ID」が1でなく2になってしまう結果でした
241
+ 惜しくも【※】の部分が欲しい結果とは微妙に異なりまして、ID=10について、「取得経緯のtag_ID」が1でなく2になってしまう結果でした(そもそもunionはあまり推奨されないようですし、他の方法を探しています)
242
+
243
+
244
+
245
+
246
+
247
+ ```sql
248
+
249
+ select p.ID, p.contents, '1' AS 取得経緯のtag_ID
250
+
251
+ from posts p
252
+
253
+ left join tag_relations tr ON tr.contents_ID = p.ID
254
+
255
+ left join tags t ON t.ID = tr.tags_ID
256
+
257
+ where t.tag_name IN ( 'タグ1' ) # 指定タグを持っている
258
+
259
+ AND p.ID NOT IN ( 1 ) # 指定記事を除外
260
+
261
+ group by p.ID
262
+
263
+
264
+
265
+ union
266
+
267
+
268
+
269
+ select p.ID, p.contents, '2' AS 取得経緯のtag_ID
270
+
271
+ from posts p
272
+
273
+ left join tag_relations tr ON tr.contents_ID = p.ID
274
+
275
+ left join tags t ON t.ID = tr.tags_ID
276
+
277
+ where t.tag_name IN ( 'タグ2' ) # 指定タグを持っている
278
+
279
+ AND p.ID NOT IN ( 1 ) # 指定記事を除外
280
+
281
+ group by p.ID
244
282
 
245
283
  ```
246
-
247
- select p.ID, p.contents, '1' AS 取得経緯のtag_ID
248
-
249
- from posts p
250
-
251
- left join tag_relations tr ON tr.contents_ID = p.ID
252
-
253
- left join tags t ON t.ID = tr.tags_ID
254
-
255
- where t.tag_name IN ( 'タグ1' ) # 指定タグを持っている
256
-
257
- AND p.ID NOT IN ( 1 ) # 指定記事を除外
258
-
259
- group by p.ID
260
-
261
-
262
-
263
- union
264
-
265
-
266
-
267
- select p.ID, p.contents, '2' AS 取得経緯のtag_ID
268
-
269
- from posts p
270
-
271
- left join tag_relations tr ON tr.contents_ID = p.ID
272
-
273
- left join tags t ON t.ID = tr.tags_ID
274
-
275
- where t.tag_name IN ( 'タグ2' ) # 指定タグを持っている
276
-
277
- AND p.ID NOT IN ( 1 ) # 指定記事を除外
278
-
279
- group by p.ID
280
-
281
- ```

1

訂正

2020/12/08 00:19

投稿

premiummalts
premiummalts

スコア3

test CHANGED
File without changes
test CHANGED
@@ -60,6 +60,8 @@
60
60
 
61
61
  ```
62
62
 
63
+ ###ソースコードの結果
64
+
63
65
  で、次のレコードが取得される状況ですが、
64
66
 
65
67
  |ID|contents|
@@ -78,6 +80,8 @@
78
80
 
79
81
 
80
82
 
83
+ ###欲しい結果
84
+
81
85
  ここに次のように「このレコードはタグ1を持つ記事として取得されました」などの「取得経緯のtag_ID」を示したいのです
82
86
 
83
87
  |ID|contents|取得経緯のtag_ID|
@@ -100,6 +104,8 @@
100
104
 
101
105
 
102
106
 
107
+ ###テーブル
108
+
103
109
  そしてテーブルはこうです
104
110
 
105
111
  ```sql
@@ -146,27 +152,27 @@
146
152
 
147
153
  CREATE TABLE tags
148
154
 
149
- (`ID` int, `tag_name` varchar(100), `rank_weekly` int)
155
+ (`ID` int, `tag_name` varchar(100))
150
156
 
151
157
  ;
152
158
 
153
159
  INSERT INTO tags
154
160
 
155
- (`ID`, `tag_name`, `rank_weekly`)
161
+ (`ID`, `tag_name`)
156
162
 
157
163
  VALUES
158
164
 
159
- (1, 'タグ1', 1),
165
+ (1, 'タグ1'),
160
-
166
+
161
- (2, 'タグ2', 2),
167
+ (2, 'タグ2'),
162
-
168
+
163
- (3, 'タグ3', 3),
169
+ (3, 'タグ3'),
164
-
170
+
165
- (3, 'タグ4', 4),
171
+ (3, 'タグ4'),
166
-
172
+
167
- (3, 'タグ5', 5),
173
+ (3, 'タグ5'),
168
-
174
+
169
- (3, 'タグ6', 6)
175
+ (3, 'タグ6')
170
176
 
171
177
  ;
172
178
 
@@ -222,32 +228,54 @@
222
228
 
223
229
 
224
230
 
225
- ###打開策
231
+ ###試したこと
226
-
232
+
227
- 最終的な目的が果せる有効な方法知りたい思って、その方法して考えたのが上記のように「取得経緯のtag_ID」を示すとう方法で
233
+ 最終的な目的めには、クエリ一つにまめずアプリケーション側で二つ実行すればいのですがまずれはなしで、一つクエリで実現したいと考え
228
-
229
-
230
-
234
+
235
+
236
+
231
- しかしもそもこ実現できるかどうかわかりません
237
+ ならばと、二つをのまま一つにまとめて、つまりunionで次のようにまとめてみ実現できるか?と思ったのですが、惜しくも…
232
-
233
-
234
-
238
+
239
+
240
+
241
+
242
+
235
- 自分考え打開策としては
243
+ 欲しい結果とは微妙に異なりまして、ID=10について、「取得経緯のtag_ID」が1なく2になってしまう結果
244
+
236
-
245
+ ```
246
+
237
- where t.tag_name IN ( 'タグ1', 'タグ2' )
247
+ select p.ID, p.contents, '1' AS 取得経緯のtag_ID
238
-
248
+
239
- という一つのクエリを、
249
+ from posts p
250
+
240
-
251
+ left join tag_relations tr ON tr.contents_ID = p.ID
252
+
253
+ left join tags t ON t.ID = tr.tags_ID
254
+
241
- where t.tag_name IN ( 'タグ1' )
255
+ where t.tag_name IN ( 'タグ1' ) # 指定タグを持っている
256
+
242
-
257
+ AND p.ID NOT IN ( 1 ) # 指定記事を除外
258
+
259
+ group by p.ID
260
+
261
+
262
+
263
+ union
264
+
265
+
266
+
267
+ select p.ID, p.contents, '2' AS 取得経緯のtag_ID
268
+
269
+ from posts p
270
+
271
+ left join tag_relations tr ON tr.contents_ID = p.ID
272
+
273
+ left join tags t ON t.ID = tr.tags_ID
274
+
243
- where t.tag_name IN ( 'タグ2' )
275
+ where t.tag_name IN ( 'タグ2' ) # 指定タグを持っている
244
-
245
- という二つのクエリにわけるというものです
276
+
246
-
247
-
248
-
249
- もし実現できないのでしたら、この打開策で良いかどうかという点もアドバイス頂けましたら幸いです
277
+ AND p.ID NOT IN ( 1 ) # 指定記事除外
250
-
251
-
252
-
278
+
253
- 宜しくおねがいいたします!
279
+ group by p.ID
280
+
281
+ ```