【问题标题】:PDO GROUP BY not returning resultsPDO GROUP BY 不返回结果
【发布时间】:2013-05-31 09:17:01
【问题描述】:

我很难获得我正在编写的 PDO 数据库类,以便很好地处理我们使用 GROUP BY 子句的查询。

例如,我想检索数据库中的文章列表,但文章使用多对多关系链接到标签。

即文章>文章标签链接

我尝试运行的查询非常简单:

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);

这会返回我想要的结果,尽管它们没有正确分组。 IE。一篇可能有 3 个标签的文章将出现 3 次(因为从技术上讲,有 3 条记录满足查询 - 不包括 GROUP BY)。所以就好像 GROUP BY 被忽略了一样。

我遇到过

$results = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
$results = array_map('reset', $results);

但它的行为同样奇怪。这将只返回一个结果(它不会返回第一篇文章三次 - 每个应用的标签一次),但它会停止在一个结果上 - 它不会继续获取另外两个。

谁能解释如何让它获取满足查询的三个唯一记录?

【问题讨论】:

  • 我自己已经设法找到了解决方案,并将为可能犯同样错误的其他人写下来。因为我已经编写了自己的 PDO 包装器,所以我通过一个方法传入所有要查询的值。该方法负责准备语句并绑定所有内容。我正在做的是不小心尝试绑定导致问题的 GROUP BY 值。请记住不要绑定它,并将 GROUP BY 作为格式化查询的常规部分。

标签: mysql pdo group-by


【解决方案1】:

您可以改用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();

【讨论】:

  • 我编写的查询本身只是为了简化示例,如果我直接在 mySQL 中运行它就没有问题。 PDO 获取结果的方式似乎是问题所在。
  • 我改变了 $results = $stmt->fetchAll(PDO::FETCH_ASSOC);到 $results = $stmt->fetchAll();但它仍然没有获取 3 个结果.. 只有一个
  • 那也不起作用。我在您的查询中硬编码以仔细检查它不是我的 sql 查询并且它产生完全相同的结果 - 所以我知道这与方式有关PDO 正在工作。
【解决方案2】:

你的特殊领域展示

SELECT articles.articleID 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-05
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多