繁体   English   中英

PHP MySQL显示分组和标记重复

[英]PHP MySQL Show Grouped & Tag Duplicates

我有一个数据库,其表如下所示:

ID | FNAME | LNAME | DATE

有些行的名字/姓氏重复,我需要能够检测到它们是重复的,并在将它们显示为列表时显示数字。

我需要像这样输出:

First Name (FNAME) / Last Name (LNAME) | Duplicate? Dupe #

我的数据库连接看起来像:

$query = "SELECT 
            FNAME,
            LNAME, 
            COUNT(LNAME) AS TOTAL
          FROM user_list
          GROUP BY LNAME";

PHP代码如下所示:

while($row = mysql_fetch_array($res)){
 echo $row['FNAME'] . " / " . $row['FNAME']. " | ". $row['TOTAL'];
 echo "<br />";
}

我似乎无法对所有内容进行分组并显示所有查询以及计算/显示总计。

所以我需要它看起来像:

汤姆/史密斯| 1个MIKE / ROBS | 1汤姆/史密斯| 2

所以...如果存在2个以上的条目,它会显示每个条目以及它在数据库中显示的条目。

如果您需要输出如下所示:

TOM / SMITH | 1
MIKE / ROBS | 1
TOM / SMITH | 2

那的确令人费解。 但是我认为,即使在单一的SQL语句中尝试全部操作,也可以做到。

假设您希望它们按名称以外的其他顺序(所有TOM SMITH一起出现),那么您可能需要添加一个唯一的ID字段,我假设您也希望按此ID字段进行排序。 然后,您可能会遇到这样的事情:

SET @name_count := 0, @prev_name := '';
SELECT FNAME, LNAME, namecount FROM user_list AS t1
INNER JOIN (
    SELECT
        ID,
        (@name_count := IF(@prev_name = CONCAT(FNAME, ' ', LNAME), @name_count+1, 1)) AS namecount,
        (@prev_name := CONCAT(FNAME, ' ', LNAME)) AS prevname
    FROM (SELECT * FROM user_list ORDER BY FNAME ASC, LNAME ASC) AS tmp
    ) AS t2 ON t1.ID = t2.ID
ORDER BY t1.ID ASC;

笔记:

  1. SQL变量@name_count和@prev_name确实取决于select语句的顺序,因此取决于内部ORDER BY。
  2. 内部子查询按名称排序,并为每个名称分配递增的排名,当遇到新名称时,从1开始。
  3. 请注意(@prev_name := ...)确实必须在(@name_count := IF(@prev_name = ..., ..., ...)之后列出,否则它将在分配之前先分配prev_name每行的name_count,导致@prev_name始终等于当前名称。
  4. 内部SQL将“等级”分配给每个名称实例,外部SQL将以原始顺序显示它们。
  5. FROM (SELECT * FROM user_list ORDER BY FNAME ASC, LNAME ASC) AS tmp不必是子查询。 它可以是FROM user_list ORDER BY FNAME ASC, LNAME ASC 但是我注意到在某些情况下,取决于你使用的ORDER BY ,特别是如果有多个字段,它可能会导致一些意外的排序。 这就是为什么我将该表放置为另一个子查询 - 因此它可以首先正确地进行名称排序,然后进行排名。
  6. 您可能必须在PHP中将其作为两个单独的查询运行。 一个查询是SET @name_count := 0, @prev_name := ''; 另一个查询是字符串的其余部分。 如果您尝试将整个字符串作为PHP中的一个查询,则在大多数情况下,它将尝试将其视为一个查询。 在phpMyAdmin或mysql控制台中,它将识别为两个单独的查询。

这样做的另一种方法是用PHP代替MySQL进行计数,在遍历输出时,您保留该名称的最后一个计数的数组,并在出现该名称时递增计数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM