私は要素のリストを生成しようとしています:
- 赤
- 緑
- オレンジ
- 青
- 黄色+
その場合、オレンジが選択され、前に2つの要素があり、後に2つの要素があります。
MySQLクエリからこのリストを取得するにはどうすればよいですか?
テーブルの例:
5-A
1-B
4-C
8-D
7-E
9-F
3-G
私は要素のリストを生成しようとしています:
その場合、オレンジが選択され、前に2つの要素があり、後に2つの要素があります。
MySQLクエリからこのリストを取得するにはどうすればよいですか?
テーブルの例:
5-A
1-B
4-C
8-D
7-E
9-F
3-G
ベース内の各要素のIDがある場合は、次のように実行できます。
SELECT element FROM table
WHERE id BETWEEN (select (id - 2) from table where element = "orange") AND (select (id + 2) from table where element = "orange")
それは動作するはずです:
SELECT id, color FROM colors WHERE id = (SELECT @i:=(id - 2)
FROM colors
WHERE color = 'orange')
UNION ALL
SELECT id, color FROM colors WHERE id = @i + 1
UNION ALL
SELECT id, color FROM colors WHERE id = @i + 3
UNION ALL
SELECT id, color FROM colors WHERE id = @i + 4;
私はついにアプリケーションコードでそれを行いました:
def get_list_queryset(self):
STEP = 5
LIST_SIZE = 2*STEP+1
current_object = self.get_object()
query_set = list(self.model.objects.order_by(*self.model._meta.ordering))
index = query_set.index(current_object)
# Index too close to start
if index < STEP:
start_ind = 0
end_ind = LIST_SIZE # We don't care if it's too big.
# Index too close to end
elif index+STEP >= len(query_set):
end_ind = len(query_set)
start_ind = end_ind>=LIST_SIZE and end_ind-LIST_SIZE or 0
else:
start_ind = index-STEP
end_ind = start_ind+LIST_SIZE
return query_set[start_ind:end_ind]
答えは、MySQLはそれを処理するのに適していないため、アプリケーションでそれを行う方が柔軟であるということです。