2016-06-27 7 views
-1

クエリ結果をLIMIT a,bで制限する方法を知っていますが、LIMITJOINで作成されたクエリに1つのプライマリIDの複数の行IDごとに少なくとも1つの行を保持しますか?MySQL/MariaDB - プライマリIDを失うことなくLIMITにクエリ結果を結合

私はポストのテーブルを持っている
... *私はより多くを説明させて、その後、カテゴリのテーブルがあります。
しかし、1つの投稿は、より多くのカテゴリに含めることができます。
私は投稿を照会するときに、同時にそのカテゴリーを照会したいと思っています...
...事は私が1つのカテゴリー最大必要です。 なお、少なくとも一つの行 - 1あたりポスト結果(私はどちらドントケア)

例示的)電流が

ID | title  | content | category_ID | category_name 
1 | First Post | ....... | 2   | Boring Articles 
1 | First Post | ....... | 5   | Interesting Articles 
1 | First Post | ....... | 1   | Mojo Tips 
2 | Second Post | ....... | 5   | Interesting Articles 
3 | Third Post | ....... | 5   | Interesting Articles 
3 | Third Post | ....... | 4   | Fitness 
4 | Fourth Post | ....... | NULL  | NULL 

所望の(例示的)結果をもたらします投稿IDごとに保管されていました!

ID | title  | content | category_ID | category_name 
1 | First Post | ....... | 2   | Boring Articles 
2 | Second Post | ....... | 5   | Interesting Articles 
3 | Third Post | ....... | 5   | Interesting Articles 
4 | Fourth Post | ....... | NULL  | NULL 

しかし、私はちょうど何か

SELECT * FROM posts 
LEFT JOIN relationships USING(ID) 
LEFT JOIN categories USING(category_ID) 
LIMIT 0,4 

のようなこれはどうなるだろう場合( が必要なデータ失う - ...もう1つのIDあたりのない1行):

ID | title  | content | category_ID | category_name 
1 | First Post | ....... | 2   | Boring Articles 
1 | First Post | ....... | 5   | Interesting Articles 
1 | First Post | ....... | 1   | Mojo Tips 
2 | Second Post | ....... | 5   | Interesting Articles 

PS:I MySQL/MariaDBでこれを解決する方法を知りたいと思っていますが、それを使うときに違いがあるなら、違いは何ですか? :)

+0

この2つの簡単な手順を実行することをお勧めします。1.まだ実行していない場合は、適切なCREATE文とINSERT文(および/またはsqlfiddle)を指定して、問題をより簡単に再現できるようにします。 2.まだ実行していない場合は、手順1で提供された情報に対応する結果セットを指定します。 – Strawberry

+0

不明な点は何ですか?なぜ私の質問が既存の結果を制限することであるのかを作成/挿入ステートメントが必要であると想像することはできません...そして、SQLクエリとサンプルの例を提供しました...私の質問のすべての上には、 DB固有のもの... –

+0

データセットのない結果セットは、ロリポップのないスティックのようなものです。全く楽しいことはありません。 「どちらに気をつけよう」という言葉は、時には貧弱なデザインを示すものでもありません。 – Strawberry

答えて

1

一つの方法は、サブクエリを使用しています。

SELECT p.*, 
     (SELECT c.category_name 
     FROM relationships r JOIN 
      categories c 
      USING (category_ID) 
     WHERE r.id = p.id 
     LIMIT 1 
    ) as category_name 
FROM posts p 
LIMIT 0, 4; 

注:LIMITを使用するときは、通常ORDER BYを持っているでしょう。

もう一つの方法は、GROUP BYを使用しています。

SELECT p.*, c.* 
FROM posts p LEFT JOIN 
    relationships r 
    USING (ID) LEFT JOIN 
    categories c 
    USING (category_ID) 
GROUP BY p.id 
LIMIT 0, 4; 

私はこのようGROUP BYを使用してのファンではないけど、それが有効なMySQLの拡張機能です。

+0

まあ、あなたは非常に特定の方法で '有効'という用語を使用しています。 – Strawberry

+0

@Gordon Linoff - もう1つの質問 - どちらが高速かを知っていますか(大きなデータを考慮すると、それ以外の場合は自分でテストします:)) –

+0

@ jave.web。 。 。最初の方が速いはずです。 2つめのグループでは、物事が減速します。もちろん、あなたはこれをテストすることができますが、それは私の期待です。 –

関連する問題