如何计数重复记录,同时能够在PHP和MYSQL中打印其他数据?
我的如何计数重复记录,同时能够在PHP和MYSQL中打印其他数据?,php,mysql,mysqli,Php,Mysql,Mysqli,我的logtrama表中有以下记录: 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
logtrama
表中有以下记录:
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
表格中:
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
因为它是唯一与两个表的并集相匹配的数据
但现在我需要的是能够在同一查询中统计重复记录,以便打印数据,总之,我希望实现最后输入的数据的以下打印,但要使用其各自的计数:
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
,以及我必须如何添加此条件才能获得所需的结果
谢谢我不完全确定您想要实现什么,但据我所知,您并不真的需要加入,因为您的
选择
字段都来自一个表。在上面的例子中,它确实将记录限制在eqipo
中有关联字段的记录中,但我假设您只是根据每个客户进行选择,因此将添加一个where
子句来实现这一效果。。。如果不是这样,那么您可以简单地将内部连接
子句添加回,并删除附加的WHERE
子句
您试图做的是将字段聚合在一起。根据您的数据和意图,您可以通过几种方式来实现这一点 从外观上看,除了
id\u logtrama
之外,所有字段都是相同的,这意味着我们可以简单地将它们添加到查询的GROUP BY
子句中:
GROUP BY idEquipo, fechaHora, idCliente
我假设(从您的示例中)您也想选择最高的id\u logtrama
?为此,我们可以使用MAX
聚合功能:
SELECT MAX(id_logtrama) as id
然后,您当然需要添加WHERE
和orderby
子句,这样您就可以:
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;
}
…或者类似的东西,朋友,但是你没有检查logtrama
表的idCliente
和idEquipo
是否与'equipo'表的idCliente
idEquipo
匹配。我能传递的唯一条件是日期,而不是idCliente
或其他数据,因为在数据库中注册的数据是通过Arduino
的,所以我需要的是,当执行Arduino
发送的数据时,然后通过邮件发送我想要打印的信息,这就是为什么我不能将idCliente
放在的位置,每天只需发送报告。@Valentina如上(第一段)所述,如果您需要,您只需添加原始的JOIN
。。。?这不是这么说的吗?对不起,我仍然不知道这不能解决问题的哪一部分。
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;