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

回答編集履歴

6

修正

2017/09/09 07:40

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -1,7 +1,8 @@
1
1
  **Ruby on Rails**は触ったことが無いのですが、ここら辺([ActiveRecord ~ 複数テーブルにまたがる検索(先読み、JOINなど)](http://qiita.com/leon-joel/items/f26556c9e56833983856))はご存知な上で、どのようなSQLを書けば良いかが分からないと解釈して、SQLのみの回答です。
2
2
 
3
3
  概要
4
- ・childrenをparent_id毎にcreated_atの昇順(同値のcreated_atを考慮しIDも条件に付加)で連番を振る
4
+ ・childrenをparent_id毎にcreated_atの昇順(同値のcreated_atを考慮しIDも条件に付加)で
5
+  連番を振る
5
6
  ・連番が指定の番号(30)以下とする。
6
7
  ・ソートはparents.ID, children.created_at
7
8
  ```SQL

5

修正

2017/09/09 07:40

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -1,5 +1,9 @@
1
1
  **Ruby on Rails**は触ったことが無いのですが、ここら辺([ActiveRecord ~ 複数テーブルにまたがる検索(先読み、JOINなど)](http://qiita.com/leon-joel/items/f26556c9e56833983856))はご存知な上で、どのようなSQLを書けば良いかが分からないと解釈して、SQLのみの回答です。
2
2
 
3
+ 概要
4
+ ・childrenをparent_id毎にcreated_atの昇順(同値のcreated_atを考慮しIDも条件に付加)で連番を振る
5
+ ・連番が指定の番号(30)以下とする。
6
+ ・ソートはparents.ID, children.created_at
3
7
  ```SQL
4
8
  select p.id as pid, p.name as pname
5
9
  , c.id as cid, c.name as cname
@@ -16,13 +20,3 @@
16
20
  on p.id=c.parent_id and c.created_order<=30
17
21
  order by p.id, c.created_at
18
22
  ```
19
- 追記
20
- ---
21
- 30行毎って要件がありましたね。
22
- 単に30行に区切って行うには、
23
- limit [offset,] row_count
24
- なので
25
- limit 30*(ページ-1), 30
26
- とすればよいですが、並び(order by)を指定する必要があります。
27
- 仮にそれぞれのIDとして、SQLに追記します。
28
- ページングは、ライブラリに任せた方が良いかと思うのですが、正直その判断はできません。

4

修正

2017/09/09 07:39

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -8,7 +8,8 @@
8
8
  select *
9
9
  , (select count(*) from children
10
10
  where parent_id=c0.parent_id
11
- and created_at<=c0.created_at
11
+ and created_at<=c0.created_at
12
+ and id<=c0.id
12
13
  ) as created_order
13
14
  from children c0
14
15
  ) as c

3

修正

2017/09/08 08:02

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -3,10 +3,17 @@
3
3
  ```SQL
4
4
  select p.id as pid, p.name as pname
5
5
  , c.id as cid, c.name as cname
6
+ , c.created_at, c.created_order
6
- from parents as p left join children as c
7
+ from parents as p left join (
8
+ select *
9
+ , (select count(*) from children
7
- on p.id=c.parent_id
10
+ where parent_id=c0.parent_id
11
+ and created_at<=c0.created_at
12
+ ) as created_order
13
+ from children c0
14
+ ) as c
15
+ on p.id=c.parent_id and c.created_order<=30
8
16
  order by p.id, c.created_at
9
- limit 30
10
17
  ```
11
18
  追記
12
19
  ---

2

修正

2017/09/08 07:55

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -5,8 +5,8 @@
5
5
  , c.id as cid, c.name as cname
6
6
  from parents as p left join children as c
7
7
  on p.id=c.parent_id
8
- order by p.id, c.id
8
+ order by p.id, c.created_at
9
- limit 30*(ページ-1) , 30
9
+ limit 30
10
10
  ```
11
11
  追記
12
12
  ---

1

追記

2017/09/08 05:31

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -5,4 +5,16 @@
5
5
  , c.id as cid, c.name as cname
6
6
  from parents as p left join children as c
7
7
  on p.id=c.parent_id
8
+ order by p.id, c.id
9
+ limit 30*(ページ-1) , 30
8
- ```
10
+ ```
11
+ 追記
12
+ ---
13
+ 30行毎って要件がありましたね。
14
+ 単に30行に区切って行うには、
15
+ limit [offset,] row_count
16
+ なので
17
+ limit 30*(ページ-1), 30
18
+ とすればよいですが、並び(order by)を指定する必要があります。
19
+ 仮にそれぞれのIDとして、SQLに追記します。
20
+ ページングは、ライブラリに任せた方が良いかと思うのですが、正直その判断はできません。