Php 在表中查找重复记录及其相关的其他重复项

Php 在表中查找重复记录及其相关的其他重复项,php,mysql,Php,Mysql,我试图在我的表中找到重复记录,我有代码来显示这些记录,但我需要修改它,以便它也显示其他重复记录。我的示例表如下所示: 如您所见,表t_sen包含重复记录,我有以下代码来显示重复记录: $sql = "SELECT ID, PARA_NUMBER, TEXT FROM t_sen GROUP BY TEXT having count(*) >= 2"; $results = mysqli_query($conn, $sql) or die(mysqli_error());

我试图在我的表中找到重复记录,我有代码来显示这些记录,但我需要修改它,以便它也显示其他重复记录。我的示例表如下所示:

如您所见,表t_sen包含重复记录,我有以下代码来显示重复记录:

    $sql = "SELECT ID, PARA_NUMBER, TEXT FROM t_sen GROUP BY TEXT having count(*) >= 2";

    $results = mysqli_query($conn, $sql) or die(mysqli_error());

    while($row = mysqli_fetch_assoc($results)){

        foreach($row as $column => $value){
            print "$column: $value <br>";
        }

        print "<br>";
    }
但是,我想要的输出是:

ID  |   PARA_NUMBER  |  TEXT
----------------------------
3   |   1            |  is
4   |   1            |  is

7   |   2            |  live
8   |   2            |  live
我希望它显示定义的PARA_编号内的另一个重复列。那么一个例子是虚构的吗?查询类似于:

SELECT ID, PARA_NUMBER, TEXT FROM t_sen (WITHIN PARA_NUMBER = 1) having count(*) >= 2
因此,输出应为:

ID  |   PARA_NUMBER  |  TEXT
----------------------------
3   |   1            |  is
4   |   1            |  is
但是,如果我不必对每个PARA_编号重复查询,那就更好了,因为有很多编号,而且只有一个查询可以显示所有重复的记录


希望我明白了。任何帮助都将不胜感激。

此查询将满足您的要求。它使用子查询查找表中具有重复文本值的所有文本值,并将其连接到原始表,以便您可以显示具有重复文本值的每个条目

输出:

ID  PARA_NUMBER     TEXT
3   1               is
4   1               is
7   2               live
8   2               live
ID  PARA_NUMBER     TEXT
3   1               is
4   1               is
ID  PARA_NUMBER     TEXT
3   1               is
4   1               is
7   2               live
8   2               live
例如,如果只想获得第1段中的副本,只需在末尾添加WHERE子句:

SELECT ID, PARA_NUMBER, t1.TEXT FROM
t_sen t1
JOIN (SELECT TEXT
      FROM t_sen
      GROUP BY TEXT
      HAVING COUNT(*) >= 2) t2
ON t1.TEXT = t2.TEXT
WHERE PARA_NUMBER = 1
输出:

ID  PARA_NUMBER     TEXT
3   1               is
4   1               is
7   2               live
8   2               live
ID  PARA_NUMBER     TEXT
3   1               is
4   1               is
ID  PARA_NUMBER     TEXT
3   1               is
4   1               is
7   2               live
8   2               live
编辑

基于OPs要求能够编辑phpMyAdmin中的行,使用联接的查询无法解决此问题。相反,需要这样的查询:

SELECT ID, PARA_NUMBER, t1.TEXT FROM
t_sen t1
WHERE EXISTS (SELECT *
              FROM t_sen t2
              WHERE t2.PARA_NUMBER = t1.PARA_NUMBER AND
                    t2.TEXT = t1.TEXT AND
                    t2.ID != t1.ID)
输出:

ID  PARA_NUMBER     TEXT
3   1               is
4   1               is
7   2               live
8   2               live
ID  PARA_NUMBER     TEXT
3   1               is
4   1               is
ID  PARA_NUMBER     TEXT
3   1               is
4   1               is
7   2               live
8   2               live

我总是使用分组来查找重复项。我的建议是:

SELECT GROUP_CONCAT(CONCAT_WS('-', ID, PARA_NUMBER, TEXT)) AS data FROM t_sen GROUP BY PARA_NUMBER HAVING COUNT(*) > 2
这将以以下格式显示结果:

| data          |
| 3-1-is,4-1-is |
左连接

SELECT
    t1.*
FROM
    t_sen AS t1
LEFT JOIN 
    t_sen AS t2 ON t1.ID != t2.ID AND t1.PARA_NUMBER = t2.PARA_NUMBER 
WHERE
    t2.ID IS NOT NULL 

t1.ID!=t2.ID不包括在两个表中匹配同一行以及连接的两侧 t1.PARA_编号=t2.PARA_编号连接重复编号上的故事 其中t2.ID不为NULL不包括不重复的记录。 您还可以使用对列来说是非常糟糕的名称的文本,方法是将该文本添加到联接的ON部分,根据需要添加或替换PARA_编号

只为子孙后代

CREATE TABLE t_sen (
    ID INT,
    PARA_NUMBER  INT,
    `TEXT` VARCHAR(20)
);

#non duplate
INSERT INTO t_sen  (ID, PARA_NUMBER, `TEXT`)VALUES(1,10,'the');
#duplicates
INSERT INTO t_sen  (ID, PARA_NUMBER, `TEXT`)VALUES(3,1,'is');
INSERT INTO t_sen  (ID, PARA_NUMBER, `TEXT`)VALUES(4,1,'is');
INSERT INTO t_sen  (ID, PARA_NUMBER, `TEXT`)VALUES(7,2,'live');
INSERT INTO t_sen  (ID, PARA_NUMBER, `TEXT`)VALUES(8,2,'live');

下面的查询应打印在段落编号和文本字段上有重复项的所有记录-

选择ID、段落编号、来自t_sen的文本,其中段落编号、文本位于
选择PARA_编号,按PARA_编号从t_sen组中选择文本,文本的计数*>=2

可能重复-查看此项,非常感谢。但是你知道为什么当我把这个查询放在phpMyAdmin中时,它告诉我我不能编辑任何东西,因为没有唯一的列,当我将ID列设置为unique、index和primary时?那是因为结果表和联接表没有唯一的键。没什么好担心的。不,我的意思是我需要编辑直接在phpMyAdmin使用此查询时显示的结果。但我不能因为你说的话。那个么我该如何解决这个问题呢?嗨,MARWAN,我已经在我的答案中添加了一种不同形式的查询,它将允许您在phpMyAdmin中进行编辑。非常感谢您的帮助!我真的很感谢你的帮助。非常感谢你的回答!非常感谢你的回答!我真的很感激,不客气。请接受解决您问题的答案。我非常感谢您的回答。谢谢!