0

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 つの一意のレコードを取得する方法を説明できる人はいますか?

4

2 に答える 2

0

代わりにINNER JOINを使用できます

これを試して

   SELECT * FROM articles a
   INNER JOIN article-tag-link atl
      ON  a.articleID = atl.articleID 
   INNER JOIN tags t
      ON  t.tagID = atl.tagID 
   GROUP BY a.articleID 
   LIMIT 3;

これを試して

  $sth->fetchAll();
于 2013-05-31T09:21:07.970 に答える