如何统计重复记录,同时打印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

然后你当然需要添加你的 WHEREORDER 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;

...或类似的东西