Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL-删除表X中的所有重复项_Mysql_Sql - Fatal编程技术网

Mysql SQL-删除表X中的所有重复项

Mysql SQL-删除表X中的所有重复项,mysql,sql,Mysql,Sql,我尝试从表fe_用户中获取所有冗余UID的列表,然后运行DELETE命令删除它们 e、 g.我有以下表格供用户使用: uid | pid | username -------------- 1 | 100 | hans 2 | 100 | karl 3 | 100 | franz 4 | 100 | karl 5 | 100 | hans 这是我选择所有重复项的方式: SELECT * FROM fe_users WHERE uid NOT IN ( SE

我尝试从表fe_用户中获取所有冗余UID的列表,然后运行DELETE命令删除它们

e、 g.我有以下表格供用户使用:

uid | pid | username
--------------
1   | 100 |  hans
2   | 100 |  karl
3   | 100 |  franz
4   | 100 |  karl
5   | 100 |  hans
这是我选择所有重复项的方式:

SELECT * FROM fe_users
WHERE uid NOT IN (
    SELECT uid  
    FROM fe_users
    WHERE pid=100
    GROUP BY username
    HAVING COUNT(username) > 1
)
AND username IN (
    SELECT username 
    FROM fe_users
    WHERE pid=100
    GROUP BY username
    HAVING COUNT(username) > 1
)
返回:

现在我必须删除它们

尝试1:

提示:刚才用DELETE替换了上面的SELECT查询

答复:

无法在FROM子句中为更新指定目标表“fe\U users”

尝试2

所以我试着再使用一个select,如中所建议的

答复:

“从pid=0 GROUP BY的fe_用户中选择uid”附近的语法错误 4号线的usernam

我不知道我如何才能做到这一点,我想知道MySQL开发人员在实现这一毫无意义的限制时会怎么想


我必须使用PHP删除它吗?

您的查询似乎比需要的更复杂。我会选择:

delete u
    from fe_users u join
         fe_users u2
         on u.pid = u2.pid and u.username = u2.username and
            u2.uid > u.uid
    where u.pid = 100;

这将删除具有相同pid和用户名且uid较大的行的所有行。您可以通过将“删除u”更改为“选择u.*”来获取列表。

我的第二次尝试包含了错误输出所述的语法错误。 我错过了,还有其他一些错误。这是工作查询:

DELETE FROM fe_users
WHERE uid NOT IN (
    SELECT uid FROM (
        SELECT uid
        FROM fe_users
        WHERE pid=100
        GROUP BY username
        HAVING COUNT(username) > 1
        ) As uid
    )
AND username IN (
    SELECT username FROM (
        SELECT username 
        FROM fe_users
        WHERE pid=100
        GROUP BY username
        HAVING COUNT(username) > 1
        ) AS username
    )
AND pid=100

我希望MySQL开发人员能够解决这一问题,这样我们就不需要添加不必要的选择。

删除*号,它不在您显示的查询中,但错误消息显示您在实际查询中使用了它。删除查询没有*两个子查询的可能重复项都缺少from子句,即您有SELECT uid SELECT uid from…,它应该是SELECT uid from SELECT uid from。。。。话虽如此,戈登的回答却不那么冗长,因此更易于阅读和维护,最终结果完全相同。@GarethD,你是对的,谢谢!
DELETE FROM fe_users
WHERE uid NOT IN (
    SELECT uid (
        SELECT uid
        FROM fe_users
        WHERE pid=100
        GROUP BY username
        HAVING COUNT(username) > 1
        )
    ) AS uid
AND username IN (
    SELECT username (
        SELECT username 
        FROM fe_users
        WHERE pid=100
        GROUP BY username
        HAVING COUNT(username) > 1
        )
    ) AS username;
delete u
    from fe_users u join
         fe_users u2
         on u.pid = u2.pid and u.username = u2.username and
            u2.uid > u.uid
    where u.pid = 100;
DELETE FROM fe_users
WHERE uid NOT IN (
    SELECT uid FROM (
        SELECT uid
        FROM fe_users
        WHERE pid=100
        GROUP BY username
        HAVING COUNT(username) > 1
        ) As uid
    )
AND username IN (
    SELECT username FROM (
        SELECT username 
        FROM fe_users
        WHERE pid=100
        GROUP BY username
        HAVING COUNT(username) > 1
        ) AS username
    )
AND pid=100