我有一个数据库,其表格如下:
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 />";
}
我似乎无法将所有内容分组并显示所有查询以及计算/显示总计。
所以我需要它看起来像:
TOM / SMITH | 1 MIKE / ROBS | 1 TOM / SMITH | 2
所以......如果存在2个以上的条目,它会显示每个条目及其在数据库中显示的条目。
答案 0 :(得分:0)
如果您需要输出如下:
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;
注意:
(@prev_name := ...)
必须在(@name_count := IF(@prev_name = ..., ..., ...)
之后列出,否则它会在每行分配name_count之前先分配prev_name,导致@prev_name始终等于当前名称。FROM (SELECT * FROM user_list ORDER BY FNAME ASC, LNAME ASC) AS tmp
的部分不一定是子查询。它可以是FROM user_list ORDER BY FNAME ASC, LNAME ASC
。但是我注意到在某些情况下,取决于你使用的ORDER BY
,特别是如果有多个字段,它可能会导致一些意外的排序。这就是为什么我将该表作为另一个子查询放置的原因 - 因此它可以首先正确地进行名称排序,然后进行排名。SET @name_count := 0, @prev_name := '';
,另一个查询为字符串的其余部分。如果您尝试将整个字符串作为一个查询放在PHP中,它将尝试在大多数情况下将其视为一个查询。在phpMyAdmin或mysql控制台中,它会将其识别为两个单独的查询。另一种方法是在PHP而不是MySQL中进行计数,在遍历输出时,保留该名称的最后一个计数数组,并在名称出现时递增计数。