Php 在表中查找重复记录及其相关的其他重复项
我试图在我的表中找到重复记录,我有代码来显示这些记录,但我需要修改它,以便它也显示其他重复记录。我的示例表如下所示: 如您所见,表t_sen包含重复记录,我有以下代码来显示重复记录: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());
$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中进行编辑。非常感谢您的帮助!我真的很感谢你的帮助。非常感谢你的回答!非常感谢你的回答!我真的很感激,不客气。请接受解决您问题的答案。我非常感谢您的回答。谢谢!