GROUP BY 句を使用するクエリをうまく処理するために書いている PDO データベース クラスを取得するのに苦労しています。
たとえば、データベース内の記事のリストを取得したいのですが、記事は多対多の関係を使用してタグにリンクされています。
例: 記事 > 記事タグ リンク < タグ
実行しようとしているクエリは非常に単純です。
SELECT * FROM articles, article-tag-link, tags WHERE articles.articleID = article-tag-link.articleID AND tags.tagID = article-tag-link.tagID GROUP BY articles.articleID LIMIT 3;
PDO でクエリを実行するために準備済みステートメントを使用しています。GROUP BY を使用しない単純なクエリは、他の場所で問題なく使用されているため、完全に機能することがわかっています。
したがって、クエリの実行に関しては、次のようにしています。
$result = $stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
これは、適切にグループ化されていませんが、必要な結果を返します。つまり、3 つのタグを持つ可能性のある 1 つの記事は、3 回表示されます (技術的にはクエリを満たすレコードが 3 つあるため、GROUP BY を除く)。つまり、GROUP BY が無視されているかのようです。
私は出くわしました
$results = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
$results = array_map('reset', $results);
しかし、それは同じように奇妙に振る舞います。これは 1 つの結果のみを返します (適用されたタグごとに 1 回、最初の記事を 3 回返すわけではありません) が、その 1 つの結果で停止します。
クエリを満たす 3 つの一意のレコードを取得する方法を説明できる人はいますか?