如何统计重复记录,同时打印PHP和MYSQL中的其他数据?
How to count duplicate records and, at the same time, be able to print other data in PHP and MYSQL?
我的 logtrama
table 中有以下记录:
id_logtrama fechaHora idCliente idEquipo
1 2021-04-18 20 8
2 2021-04-18 20 8
3 2021-04-18 20 8
4 2021-04-18 20 1
5 2021-04-18 4 4
并且,在我的 equipo
table 中:
idEquipo idCliente tipo
1 20 Alarm1
2 1 Alarm2
3 2 Alarm3
8 20 Alarm4
现在通过我的查询打印符合给定条件的结果:
$stmt = $con->prepare("SELECT l.id_logtrama,
l.fechaHora,
l.idCliente,
l.idEquipo,
l.statusGlobal
FROM logtrama l
INNER JOIN equipo e ON l.idEquipo=e.idEquipo AND l.idCliente=e.idCliente
WHERE DATE(fechaHora)=? GROUP BY l.id_logtrama");
$stmt->bind_param("s", $date_day);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$stmt->bind_result(
$id_logtrama,
$fechaHora,
$pag_idCliente,
$pag_idEquipo,
$statusGlobal
);
while ($stmt->fetch()) {
//print_r(expression)
}
}
换句话说,它会打印出如下结果:
1 2021-04-18 20 8
2 2021-04-18 20 8
3 2021-04-18 20 8
4 2021-04-18 20 1
因为它是唯一与两个 table 的并集相匹配的数据。
但现在我需要的是能够计算同一查询中的重复记录以便打印数据,总之我想实现以下打印最后输入的数据但具有各自的计数:
ID: 3 Date: 2021-04-18 ID Customer: 20 Id Team: 8 Total repeated records: (3)
ID: 4 Date: 2021-04-18 ID Customer: 20 ID team: 1 Total repeated records: (1)
我怎样才能得到那个结果?您能否向我解释一下我可以向查询添加哪些其他条件,可能是 COUNT (*)
或 SUM
,以及我必须如何添加此条件才能获得所需的结果。
谢谢
我不完全确定你想要实现什么,但据我所知你并不真的需要 JOIN
因为你的 SELECT
字段都来自一个 table。在上面,它确实将记录限制在 eqipo
中有关联字段的记录,但我假设您只是根据每个客户进行选择,因此将添加 WHERE
子句达到那种效果......如果不是这种情况,那么你可以简单地添加 INNER JOIN
子句并删除额外的 WHERE
子句。
您试图做的是将字段聚合在一起。根据您的数据和意图,您可以通过多种方式执行此操作。
从外观上看,除了 id_logtrama
之外,所有字段都是相同的,这意味着我们可以简单地将它们添加到查询的 GROUP BY
子句中:
GROUP BY idEquipo, fechaHora, idCliente
我假设(根据你的例子)你也想 SELECT
最高 id_logtrama
?为此,我们可以利用 MAX
聚合函数:
SELECT MAX(id_logtrama) as id
然后你当然需要添加你的 WHERE
和 ORDER BY
子句,留下类似的东西:
SELECT MAX(id_logtrama) as id,
fechaHora as date,
idCliente as customer,
idEquipo as team,
COUNT(*) as count
FROM logtrama
WHERE fechaHora = ?
AND idCliente = ?
GROUP BY idEquipo, fechaHora, idCliente
ORDER BY id
在代码中:
$sql = "
SELECT MAX(id_logtrama) as id,
fechaHora as date,
idCliente as customer,
idEquipo as team,
COUNT(*) as count
FROM logtrama
WHERE fechaHora = ?
AND idCliente = ?
GROUP BY idEquipo, fechaHora, idCliente
ORDER BY id
";
$query = $con->prepare($sql);
$query->bind_param("si", $date_day, $client_id);
$query->execute();
$query->store_result();
$query->bind_result($id, $date, $customer, $team, $count);
while ($query->fetch()) {
echo "ID: {$id}, DATE: {$date}, CustomerID: {$customer}, TeamID: {$team}, Total: $count", PHP_EOL;
}
SELECT a.id_logtrama
, a.fechaHora
, a.idCliente
, a.idEquipo
, b.tipo
, c.totals
FROM logtrama a
JOIN equipo b
ON b.idequipo = a.idequipo
AND b.idCliente = a.idCliente
JOIN
( SELECT MAX(t.id_logtrama) id_logtrama
, COUNT(*) totals
FROM logtrama t
JOIN equipo e
ON e.idequipo = t.idequipo
AND e.idCliente = t.idCliente
GROUP
BY t.idcliente
, t.idequipo
) c
ON c.id_logtrama = a.id_logtrama;
...或类似的东西
我的 logtrama
table 中有以下记录:
id_logtrama fechaHora idCliente idEquipo
1 2021-04-18 20 8
2 2021-04-18 20 8
3 2021-04-18 20 8
4 2021-04-18 20 1
5 2021-04-18 4 4
并且,在我的 equipo
table 中:
idEquipo idCliente tipo
1 20 Alarm1
2 1 Alarm2
3 2 Alarm3
8 20 Alarm4
现在通过我的查询打印符合给定条件的结果:
$stmt = $con->prepare("SELECT l.id_logtrama,
l.fechaHora,
l.idCliente,
l.idEquipo,
l.statusGlobal
FROM logtrama l
INNER JOIN equipo e ON l.idEquipo=e.idEquipo AND l.idCliente=e.idCliente
WHERE DATE(fechaHora)=? GROUP BY l.id_logtrama");
$stmt->bind_param("s", $date_day);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$stmt->bind_result(
$id_logtrama,
$fechaHora,
$pag_idCliente,
$pag_idEquipo,
$statusGlobal
);
while ($stmt->fetch()) {
//print_r(expression)
}
}
换句话说,它会打印出如下结果:
1 2021-04-18 20 8
2 2021-04-18 20 8
3 2021-04-18 20 8
4 2021-04-18 20 1
因为它是唯一与两个 table 的并集相匹配的数据。
但现在我需要的是能够计算同一查询中的重复记录以便打印数据,总之我想实现以下打印最后输入的数据但具有各自的计数:
ID: 3 Date: 2021-04-18 ID Customer: 20 Id Team: 8 Total repeated records: (3)
ID: 4 Date: 2021-04-18 ID Customer: 20 ID team: 1 Total repeated records: (1)
我怎样才能得到那个结果?您能否向我解释一下我可以向查询添加哪些其他条件,可能是 COUNT (*)
或 SUM
,以及我必须如何添加此条件才能获得所需的结果。
谢谢
我不完全确定你想要实现什么,但据我所知你并不真的需要 JOIN
因为你的 SELECT
字段都来自一个 table。在上面,它确实将记录限制在 eqipo
中有关联字段的记录,但我假设您只是根据每个客户进行选择,因此将添加 WHERE
子句达到那种效果......如果不是这种情况,那么你可以简单地添加 INNER JOIN
子句并删除额外的 WHERE
子句。
您试图做的是将字段聚合在一起。根据您的数据和意图,您可以通过多种方式执行此操作。
从外观上看,除了 id_logtrama
之外,所有字段都是相同的,这意味着我们可以简单地将它们添加到查询的 GROUP BY
子句中:
GROUP BY idEquipo, fechaHora, idCliente
我假设(根据你的例子)你也想 SELECT
最高 id_logtrama
?为此,我们可以利用 MAX
聚合函数:
SELECT MAX(id_logtrama) as id
然后你当然需要添加你的 WHERE
和 ORDER BY
子句,留下类似的东西:
SELECT MAX(id_logtrama) as id,
fechaHora as date,
idCliente as customer,
idEquipo as team,
COUNT(*) as count
FROM logtrama
WHERE fechaHora = ?
AND idCliente = ?
GROUP BY idEquipo, fechaHora, idCliente
ORDER BY id
在代码中:
$sql = "
SELECT MAX(id_logtrama) as id,
fechaHora as date,
idCliente as customer,
idEquipo as team,
COUNT(*) as count
FROM logtrama
WHERE fechaHora = ?
AND idCliente = ?
GROUP BY idEquipo, fechaHora, idCliente
ORDER BY id
";
$query = $con->prepare($sql);
$query->bind_param("si", $date_day, $client_id);
$query->execute();
$query->store_result();
$query->bind_result($id, $date, $customer, $team, $count);
while ($query->fetch()) {
echo "ID: {$id}, DATE: {$date}, CustomerID: {$customer}, TeamID: {$team}, Total: $count", PHP_EOL;
}
SELECT a.id_logtrama
, a.fechaHora
, a.idCliente
, a.idEquipo
, b.tipo
, c.totals
FROM logtrama a
JOIN equipo b
ON b.idequipo = a.idequipo
AND b.idCliente = a.idCliente
JOIN
( SELECT MAX(t.id_logtrama) id_logtrama
, COUNT(*) totals
FROM logtrama t
JOIN equipo e
ON e.idequipo = t.idequipo
AND e.idCliente = t.idCliente
GROUP
BY t.idcliente
, t.idequipo
) c
ON c.id_logtrama = a.id_logtrama;
...或类似的东西