2017-06-29 7 views
0

私は他の誰かのプロジェクトに取り組んでいます。このようなクエリがあります:IN句を使用するときにGROUP BYを使用する必要がありますか?

SELECT  posts.id, posts.title, posts.body, posts.keywords 
FROM  posts 
INNER JOIN pivot ON pivot.post_id = posts.id 
INNER JOIN tags ON tags.id = pivot.tag_id 
WHERE  tags.name IN (:keywords) 
GROUP BY posts.id 

新しいポリシーは=INを交換することです。だから私が書いたクエリは次のようになります。

SELECT  posts.id, posts.title, posts.body, posts.keywords 
FROM  posts 
INNER JOIN pivot ON pivot.post_id = posts.id 
INNER JOIN tags ON tags.id = pivot.tag_id 
WHERE  tags.name = :keyword 
GROUP BY posts.id 

今、私が知りたいのは、この場合、冗長GROUP BYているのですか?私はGROUP BYの理由が各キーワードと一致する重複した投稿を省略していると思うので、そう言います。

+0

グループでは、同じようなレコードを照合するためです。これはINコマンドとはまったく異なります。 – Chuck

+1

GROUP BYはこれらの両方で不正に使用され、誤った使用の副作用としてレコードを重複除外することがあります。 MIN()、MAX()、COUNT()、SUM()などの集合体を対象としています。これを重複排除するには、 'SELECT DISTINCT'を使います。 –

+2

by groupは単に冗長ではありません。両方のインスタンスで完全に不適切です。 – Strawberry

答えて

1

最初に、SELECTステートメント内でGROUP BYを使用する場合、グループ化句に含まれていないすべての列を集約関数でラップする必要があります。

MySQLはこの種の奇妙な動作を許可しているだけで、ベストプラクティスにはなりません。例えばPostgreSQLのような他のDBMSでは、このクエリをまったく実行できません。

MySQLで内部的にどのように動作するかは、posts.idごとに固有のレコードが得られますが、集計されていないすべてのグループ化されていない列に対しては異なる行からランダムな値が得られます。

あなたは私が見るものからDISTINCTを使用する必要があります。あなたはそれにリストが、単一の値を渡していない場合は特にそれで行くことは自由ですので、全くのグループ化には影響しません=INを交換し、あなたの質問


回答いずれの場合でもGROUP BYは重複していません(または両方で完全に削除する必要があります)。それは受け取った出力を変更します。

たとえば、テーブル内の一意の列でグループ化し、それを1:1の関係のテーブルに結合すると、GROUP BYは冗長になります。条件付き適切なWHERE節を構築する第2の例は、それを冗長にするかもしれない。

+0

私は結果が常にユニークになると思います。なぜ私はあなたが重複した投稿が一致するかもしれないと思うのか分かりません。 [Here](https://stackoverflow.com/questions/44444902/how-can-i-select-all-posts-which-have-specific-tags)は私のテーブル構造です。あなたはまだ 'GROUP BY 'が必要だと思いますか? –

+1

私が言ったように:_ "または両方で完全に削除する必要があります" _。私はあなたのテーブルにあなたが強制した主キーと制約に精通していません。 'posts(id)'がユニークで、 'tags(id)'が一意で、 'pivot(post_id、tag_id)'が一意であるなら、** BOTH **クエリでは 'GROUP BY'は必要ありません。 –

+0

これは..あなたの情報のために、私は 'GROUP BY' **が最初のクエリで**必要であると思います。それは 'IN'節を使用するので、投稿ごとに異なるタグごとに複数回マッチさせることができます。投稿に 'mysql'と' sql'タグの両方があるとします。したがって、IN( 'mysql'、 'SQL') 'という条件では、mysqlの場合は1回、' sql'の場合は1回の間、このポストは2回マッチします。条件が 'IN'のときは' GROUP BY 'が必要です。 –

関連する問題