投稿が保存されるテーブル「gems」があります(ブログなど)。投稿への返信も、親投稿のキーを格納するフィールドとともに同じテーブルに格納されます。各投稿にはファイルを添付できます。
返信と添付ファイルが関連付けられた投稿のリストを取得する必要があります。したがって、「gems」には複数の左結合があります。1つはそれ自体に、もう1つはファイル名とともに「gemdetail」になります。このクエリは機能します:
SELECT g.gemid as gemidx, g.title, gemdetail.filename, r.gemid as rgemid, r.title, r.filename
FROM (SELECT * FROM gems WHERE gems.grade = '7' LIMIT 0, 10) g
LEFT JOIN (SELECT x.title, x.gemid, x.replygemid, y.filename from gems x
LEFT JOIN gemdetail y ON x.gemid = y.gemid ) r ON g.gemid = r.replygemid
LEFT JOIN gemdetail ON g.gemid = gemdetail.gemid
ただし、投稿ごとに20の返信と10のファイルがある場合、返されるレコードの数は投稿ごとに200になります。LIMIT句は機能しますが、これはまだ多くのレコードです。さらに、レコードセットを扱うのはクマです。
投稿ごとに(200ではなく)40レコードのみを返すUNIONを使用するようにクエリを書き直しました。UNIONには4つの部分があります-1)最初の10レコードを返します(LIMIT)2)投稿のファイル名を取得します3)返信を取得します4)返信のファイル名を取得します
以下のUNIONクエリは、UNIONの最初の部分以外で返されるレコードの数を制限できないことを除いて機能します。UNIONの各部分にLIMITステートメントを入れることはできますが、これは正しくありません(ファイルと返信をLIMITED 10の投稿のセットに制限したい)。いずれかのUNIONにWHEREgemidIN(SELECT gemid from gems ....)句を使用しようとすると、mySQLサブクエリ制限エラーが発生します。
SELECT g.gemid as gemidx, g.title, NULL as filename, NULL as rgemid, 'ag' as flag
FROM (SELECT * FROM gems WHERE ISNULL(gems.replygemid) AND gems.grade = '7' LIMIT 0, 10) g
LEFT JOIN (SELECT * FROM gems) r ON g.gemid = r.replygemid
UNION SELECT g.gemid as gemidx, g.title, gemdetail.filename as filename, NULL as rgemid, 'bf' as flag
FROM (SELECT * FROM gems WHERE ISNULL(gems.replygemid) AND gems.grade = '7') g
INNER JOIN gemdetail ON g.gemid = gemdetail.gemid
UNION SELECT g.replygemid as gemidx, g.title, NULL as filename, g.gemid as rgemid, 'cr' as flag
FROM (SELECT * FROM gems WHERE NOT ISNULL(gems.replygemid) AND gems.grade = '7') g
UNION SELECT g.replygemid as gemidx, g.title, gemdetail.filename as filename, g.gemid as rgemid, 'df' as flag
FROM (SELECT * FROM gems WHERE NOT ISNULL(gems.replygemid) AND gems.grade = '7') g
INNER JOIN gemdetail ON g.gemid = gemdetail.gemid
ORDER BY gemidx desc, rgemid, flag
助けてください。(ページネーションのために)10件の投稿とそれに関連するすべての返信とファイルのみを効率的に選択する方法はありますか?これをお読みいただきありがとうございます。私はこれに2日間を費やし、限界に達しています(お粗末なしゃれが意図されています...)。