通过sql查询显示组的每个记录

时间:2015-03-23 15:03:46

标签: mysql pdo

我有一个这样的广告表:

 id  adid  approveby
 1   10    MR A    
 2   11    MR A 
 3   12    MR B

我想计算MR A的总记录并回显每条记录,所以我有这个SQL查询:

$sql = "SELECT *, count(*) AS `totaladsapproved` FROM ads GROUP BY approveby";
$result = $conn->prepare($sql);
$result->execute();
foreach ($result as $row){
 echo "Name: $row[approveby]"." - Total ads approved: $row[totaladsapproved] <br>";
  for($i=0;$i<$row['totaladsapproved'];$i++){
  echo "Ad ID: $row[adid] <br>"
  }
}

但它只显示adid 10两次。这是我得到的结果:

Name: MR A - Total ads approved: 2
      AD ID: 10
      AD ID: 10

我想显示AD ID 10,然后显示AD ID 11 ......我该怎么做才能实现这个目标?

非常感谢

2 个答案:

答案 0 :(得分:0)

您的查询正在分组,因此您不会看到每个ID

使用以下内容,这将为您计算每行的“aproveby”总数

SELECT id,
       adid,
      approveby,
      (select count(*) from ads where approveby
        = t1.approveby) AS `totaladsapproved`
 FROM ads t1

如果您想限制为MR A,可以使用where clause

答案 1 :(得分:0)

代码有很多问题。它们将在下面逐一解决。

未定义$i

您的代码为:

foreach ($result as $row){
    echo "Name: $row[approveby]"." - Total ads approved: $row[totaladsapproved] <br>";
    for ($i; $i < $row['totaladsapproved']; $i ++) {
        echo "Ad ID: $row[adid] <br>";
    }
}

首先要注意的是$i未初始化,但您使用它来迭代for()循环。 PHP很不错,除了向您显示您不关心的通知之外,由于数字上下文在处理0时在第一个循环上使用NULL而不是$i检查条件并增加$i

正确的做法是:

    for ($i = 0; $i < $row['totaladsapproved']; $i ++) {

不仅仅是因为我上面提到的,而且因为使用您的代码,在下一次foreach()次迭代中,$i2开头,而for()循环跳过前两次迭代。

循环中的逻辑错误

您在变量$row中获得了一行,但是您只需打印2次(或多次$row['totaladsapproved']说),而无需从结果集中获取后续行。

要修复它,您可以从for()循环中的结果集中获取新行。我不在这里提供代码,因为它无关紧要,无论如何查询都是错误的。

有关使用GROUP BY

的查询的一般注意事项

如果您想获取记录,请不要使用GROUP BYGROUP BY approvebyapproveby具有相同值的所有行生成一行。

在具有SELECT子句的查询的GROUP BY子句中,您只能使用:

  • 也是appear in the GROUP BY clause;
  • 的列
  • 其他列在功能上依赖于GROUP BY子句中出现的字段;这意味着,只有表格的PKUNIQUE INDEX出现在GROUP BY子句中时,才能使用表格中的任何一列; < / LI>
  • 表的任何列,如果它用作GROUP BY aggregate function的参数。

SELECT子句中出现的任何列都未在上面的列表中描述,导致查询无效(根据SQL标准)。

MySQL扩展了标准并允许这样的无效查询(当然,只要语法正确),但它不保证结果集中返回的这些列的值。

  

...使用MySQL的{​​{1}}扩展名允许GROUP BY列表,SELECT条件或HAVING列表引用非聚集列,即使列在功能上不依赖于ORDER BY列。这会导致GROUP BY接受(...)查询。在这种情况下,服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的。

查询不正确

返回查询,因为上面的列表中未包含MySQLid列,因此adid列表中的*会导致查询无效,列SELECTid返回的值不确定。

在您的情况下,adidapprovedby == 'MR A'决定返回(MySQL1)(10id )。在您从表中添加或删除某些行之后(或者在不同服务器上转储和导​​入表时),它可能会返回(adid2)。它甚至可以返回(111),它仍然是正确的。它甚至可以返回11-1或其想要的任何值,但您仍然不能责怪它,因为NULL是未解决或决定的事情。

正确的查询

对您的案例的正确查询非常简单:

indeterminate

使用SELECT * FROM ads ORDER BY approveby 非常重要,可以使ORDER BY的值具有相同的值。然后,在PHP代码中运行返回的结果集,计算approveby的每个值的行数,将其存储在另一个列表中或使用它执行任何操作。

approveby

如果在枚举组中的行之前不需要每个组中的行数,则代码变得更加简单:从代码中移除对变量$howMany = array(); // store the number of rows in each group $current = '--fake--'; // the current group (use a value that does not appear in the data) $count = 0; // the number of rows in the current group foreach ($result as $row) { // Check if a new group started if ($row['approvedby'] != $current) { // Store the value for the current 'approveby' $howMany[$current] = $count; // Start counting for the new value of 'approvedby' $current = $row['approveby']; $count = 0; } // Count the new occurrence $count ++; } // Store the number of rows from the last group $howMany[$current] = $count; // Remove the fake value inserted on the first loop unset($howMany['--fake--']); // Use the initial value of $current 的所有引用。