2016-05-22 3 views
2

コレクションと投稿という2つのテーブルがあります。私は、コレクション名と、ユーザーが収集した各コレクションから3つの投稿を表示する必要があります。コレクションの中には、3つ以下のポストがあり、ポストがないものもあります。また左ジョイントクエリの結果をもう一度取得する

MySQLテーブル

コレクション

| collection_id | collection_name | uid | 
| 1    | My collection 01 | 1 | 
| 2    | My collection 02 | 1 | 
| 3    | My collection 03 | 1 | 
| 4    | My collection 04 | 2 | 
| 5    | My collection 05 | 2 | 
| 6    | My collection 06 | 1 | 

投稿

| posts_id  | post_title | cid | 
| 1    | post title 1 | 1 | 
| 2    | post title 2 | 1 | 
| 3    | post title 3 | 1 | 
| 4    | post title 4 | 3 | 
| 5    | post title 5 | 2 | 
| 6    | post title 6 | 3 | 

CIDがある私は(記事の合計数ではありませんが、ポストは、クエリによって生成)の記事をカウントする必要がありますコレクションID。だから、私がしたいと思うのは、ユーザーIDです。結果を表示したい

3 posts from My collection 01 
post title 1 
post title 2 
post title 3 

1 posts from My collection 02 
post title 5 

2 posts from My collection 02 
post title 4 
post title 6 

上記の表に追加したダミーデータに従って例を作成しました。私は左で試してみました
は、私はコレクション名と1つのポストを得ることができ、このクエリではありません運

SELECT * FROM collections LEFT JOIN posts ON posts.cid= collections. collection_id WHERE posts ON posts.cid= collections. collection_id AND collections. uid=1 ORDER BY collections. collection_id DESC LIMIT 0, 16 

に参加します。そして、(他の内部1)

しかし、私は2つのクエリを実行した場合、それは動作します

SELECT * FROM collections WHERE uid=1 ORDER BY collection_id DESC LIMIT 0, 16 

私はコレクションIDを取得しながら、内部に別のクエリを実行して上記のクエリ

SELECT * FROM posts WHERE cid=$collection_id ORDER BY post_id DESC LIMIT 0, 3 

Iのループ単一のクエリでそれをするのが大好きです。あなたの助けが大変ありがとうございます。

答えて

0

これを行う簡単な方法はありません。たぶん非常に複雑なクエリであるかもしれませんが、維持することは難しく、いくつかのより単純なクエリで行うよりも効率が低いかもしれません。

あなたが記述した解決策はもちろん、2つではなく1 +(カテゴリの数)のクエリです。あなたはそれらを簡単に結合することができます。そして、2つのクエリと少ないトリップでデータベースを行いますが、dbと同様の負荷があなたのソリューションに比べてあります。

もしあなたが仮定しても、単一のクエリですべてをフェッチする方法があるとしたら、dbはほぼ同じ作業を行う必要があります(すべてのカテゴリから3つの最新の投稿を取得します)。したがって、2つのクエリ対1の仮説を持つことは、パフォーマンスに関して大きなペナルティではありません。さらに、DBエンジンに最適な実行計画を見つける際に、特に関数などを追加する場合に問題が生じることがあります。

そして最後の解決策です。各カテゴリから最大3つの投稿を取得する方法がありますが、スキーマやアプリケーション側の作業を変更する必要があります。ブール値の列「most_recent」を追加して、1猫につき3つの投稿を常に設定することができます。 trueで、残りはfalseです。投稿を追加/削除するたびに更新し続ける必要があります。これはdbトリガーでも達成可能です。その後、あなたの問題は解決するのは簡単ですが、あなたが事前計算をいくつか行っただけです。

関連する問題