以前も質問してみたのですが、よくわからない専門用語がないと具体的に質問するのは難しいです。ここに例があります
たとえば、次のクエリを使用します。
(
SELECT *
FROM comments
WHERE depth = 0
ORDER BY id DESC
LIMIT 2
)
UNION ALL
(
SELECT c.*
FROM comments c JOIN
(
SELECT id
FROM comments
WHERE depth = 0
ORDER BY id DESC
LIMIT 2
) p ON c.parent_id = p.id
LIMIT 5
)
id parent_id depth title
1 0 0 Title 1
2 0 0 Title 2
3 1 1 Title 3
4 1 1 Title 4
5 1 1 Title 5
6 1 1 Title 6
7 1 1 Title 7
2 つの深さ 0 の行を取得し、結合では、これら 2 つの返されたクエリの 5 つの子要素も取得します。私が取得したいのは、これら 2 つのクエリのそれぞれの 5 つの子要素、合計 10 行 (深さ 1) を取得することです。例えば:
id parent_id depth title
1 0 0 Title 1
2 0 0 Title 2
3 1 1 Title 3
4 1 1 Title 4
5 1 1 Title 5
6 1 1 Title 6
7 1 1 Title 7
8 2 1 Title 8
9 2 1 Title 9
10 2 1 Title 10
11 2 1 Title 11
12 2 1 Title 12
隣接リストと、すべてをユニオン (フラット) として返す必要がある場合でも、それは可能ですか?
編集:ビル・カーウィンの答えのおかげで、私は今それを働かせました。これをもっと短く書く方法があるかどうか、私はまだ疑問に思っています。6 (0-5) の深さレベルがあるため、クエリはかなり長くなります (おそらく最適ではありません)。これが 3 つのレベルの外観です (完全なレベルがどのように見えるか想像できます)。
-- DEPTH LEVEL 0
(
SELECT * FROM (
SELECT *, 1 as _rn, @parent:=0
FROM comments
WHERE depth = 0
ORDER BY id DESC
LIMIT 2
) as D0
)
union all
-- DEPTH LEVEL 1
(
SELECT *
FROM (
SELECT c.*, @row:=IF(@parent=c.comment_id,@row+1,1) AS _rn, @parent:=c.comment_id
FROM (SELECT @parent:=null) AS _init
STRAIGHT_JOIN comments c
INNER JOIN
(
SELECT id
FROM comments
WHERE depth = 0
ORDER BY id DESC
LIMIT 2
) p ON c.comment_id = p.id
) AS _ranked
WHERE _ranked._rn <= 5
)
union all
-- DEPTH LEVEL 2
(
SELECT *
FROM (
SELECT c.*, @row:=IF(@parent=c.comment_id,@row+1,1) AS _rn, @parent:=c.comment_id
FROM (SELECT @parent:=null) AS _init
STRAIGHT_JOIN comments c
INNER JOIN
(
(
SELECT *
FROM (
SELECT c.*, @row:=IF(@parent=c.comment_id,@row+1,1) AS _rn, @parent:=c.comment_id
FROM (SELECT @parent:=null) AS _init
STRAIGHT_JOIN comments c
INNER JOIN
(
SELECT id
FROM comments
WHERE depth = 0
ORDER BY id DESC
LIMIT 2
) p ON c.comment_id = p.id
) AS _ranked
WHERE _ranked._rn <= 2
)
) p ON c.comment_id = p.id
) AS _ranked
WHERE _ranked._rn <= 2
)