【问题标题】:fetch data from mysql and replace duplicate entry从 mysql 获取数据并替换重复的条目
【发布时间】:2018-06-28 18:47:00
【问题描述】:

我有一个表名test,列有id(primary key)t1(varchar)t1 包含具有多个重复条目的电子邮件 ID。所以我想选择所有数据并将重复的条目替换为空白行,例如:

表格看起来像

 id   |   t1
  1   |    a@gmail.com
  2   |    b@gmail.com
  3   |    c@gmail.com
  4   |    a@gmail.com
  5   |    e@gmail.com
  6   |    c@gmail.com

我想要的结果

 id   |   t1
  1   |    a@gmail.com
  2   |    b@gmail.com
  3   |    c@gmail.com
  4   |    DUPLICATE
  5   |    e@gmail.com
  6   |    DUPLICATE

FIDDLE 链接:http://sqlfiddle.com/#!9/e94620/2

我可以用 PHP 完成这项工作吗

【问题讨论】:

  • 那么你尝试了什么......
  • 我可以得到重复的条目,但是如何替换它们。我附上了小提琴链接@YashParekh
  • 最好根据您的需要获取所有数据并在 PHP 中对其进行操作。
  • 在 MySQL 中尝试 DISTINCT 查询无需使用 php,如果您不想使用 DISTINCT,那么在 php 中您可以在重复条目数组上调用 array_unique
  • 我怀疑在 PHP 中会更容易。从表中选择所有数据。创建一个数组来保存您以前见过的值。每次处理数据库中的一行时,检查它是否在前见值数组中。如果没有,请将其添加到该数组并移至下一行。如果它 已经看到,则运行 SQL UPDATE 以根据您的要求将行中的值更改为 DUPLICATE。逻辑不太难,你可以自己试试

标签: php mysql


【解决方案1】:

所以...

我看过这个,在PHP中要容易得多,例如,我有以下脚本;

<table>
    <tr>
        <th>ID</th>
        <th>Email</th>
    </tr>

<?php

$data = [ // This will be your info from DB
    1 => 'a@gmail.com',
    2 => 'b@gmail.com',
    3 => 'c@gmail.com',
    4 => 'a@gmail.com',
    5 => 'e@gmail.com',
    6 => 'c@gmail.com'
];

$used_emails = [];

foreach ($data as $key => $part)
{
    print "<tr><td>" . $key . "</td><td>";
    if (!in_array($part, $used_emails))
    {
        print $part;
        $used_emails[] = $part;
    }
    else
    {
        print "duplicate";
    }
    print "<td></tr>";
}

?>

</table>

这会导致;

ID  Email
1   a@gmail.com 
2   b@gmail.com 
3   c@gmail.com 
4   duplicate   
5   e@gmail.com 
6   duplicate   

这会得到结果,对于每一个,检查它们是否被使用过,如果没有,显示并说它被使用过,否则,打印“重复”

这是我的示例; https://tehplayground.com/BKTIXja1usyRxYM3

【讨论】:

  • 还有一个问题,我有 2 个选择框,用户可以从中选择范围,例如用户选择 from=10 和 to=18,而不是删除重复项,因为您的答案有效,但只能从 id 10 打印到id 18. 我该怎么做
【解决方案2】:

或使用 SQL 查询:

select id, t_new as t1
from
(
  select id, t1,
      @num := if(@data = `t1`, @num + 1, 1) as `counter`,
      if(@num>1, 'DUPLICATE', `t1`) as t_new,
      @data := `t1` as `blabla`
  from
  `test`
  order by `t1`
) x
order by `id`

Sqlfiddle here

【讨论】:

  • 您应该解释您的答案以便更好地理解 OP。与其他答案相比,它可能会导致提高。
猜你喜欢
  • 2023-03-15
  • 2018-04-26
  • 2015-07-30
  • 1970-01-01
  • 2021-12-23
  • 2012-02-12
  • 2014-12-14
  • 1970-01-01
相关资源
最近更新 更多