我有一个这样的广告表:
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 ......我该怎么做才能实现这个目标?
非常感谢
答案 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()
次迭代中,$i
以2
开头,而for()
循环跳过前两次迭代。
您在变量$row
中获得了一行,但是您只需打印2
次(或多次$row['totaladsapproved']
说),而无需从结果集中获取后续行。
要修复它,您可以从for()
循环中的结果集中获取新行。我不在这里提供代码,因为它无关紧要,无论如何查询都是错误的。
GROUP BY
如果您想获取记录,请不要使用GROUP BY
。 GROUP BY approveby
从approveby
具有相同值的所有行生成一行。
在具有SELECT
子句的查询的GROUP BY
子句中,您只能使用:
GROUP BY
clause; GROUP BY
子句中出现的字段;这意味着,只有表格的PK
或UNIQUE INDEX
出现在GROUP BY
子句中时,才能使用表格中的任何一列; < / LI>
GROUP BY
aggregate function的参数。 SELECT
子句中出现的任何列都未在上面的列表中描述,导致查询无效(根据SQL
标准)。
MySQL
扩展了标准并允许这样的无效查询(当然,只要语法正确),但它不保证结果集中返回的这些列的值。
...使用
MySQL
的{{1}}扩展名允许GROUP BY
列表,SELECT
条件或HAVING
列表引用非聚集列,即使列在功能上不依赖于ORDER BY
列。这会导致GROUP BY
接受(...)查询。在这种情况下,服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的。
返回查询,因为上面的列表中未包含MySQL
和id
列,因此adid
列表中的*
会导致查询无效,列SELECT
和id
返回的值不确定。
在您的情况下,adid
,approvedby == 'MR A'
决定返回(MySQL
,1
)(10
,id
)。在您从表中添加或删除某些行之后(或者在不同服务器上转储和导入表时),它可能会返回(adid
,2
)。它甚至可以返回(11
,1
),它仍然是正确的。它甚至可以返回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
的所有引用。