PHP SQL - 高级删除查询

时间:2012-03-20 10:07:35

标签: mysql

我有一个包含3列的表:iddatename。我要找的是删除名称重复的记录。规则应该是保留具有最早日期的记录。例如,在下面的示例中,有3条记录名为Paul。因此,我希望保留具有最早日期(id=1)的日期并删除所有其他日期(id = 4 and 6)。我知道如何进行插入,更新等查询,但在这里我不知道如何使这个技巧工作。

id, date, name

1, 2012-03-10, Paul
2, 2012-03-10, James
4, 2012-03-12, Paul
5, 2012-03-11, Ricardo
6, 2012-03-13, Paul

mysql_query(?);

6 个答案:

答案 0 :(得分:1)

  1. 选择您要保留的所有记录
  2. 将它们插入临时表
  3. 删除原始表格中的所有内容
  4. 将所有内容从临时表插入原始

答案 1 :(得分:1)

我可以给你的最佳建议是name上创建一个独特的索引,避免一切麻烦。

按照Peter Kiss中的步骤2至3进行操作。然后执行此操作

ALTER Table tablename ADD UNIQUE INDEX name (name)

然后关注4 Insert everything from the temporary table to the original

所有新的重复行都将被省略

答案 2 :(得分:1)

这样的事情会起作用:

DELETE FROM tablename WHERE id NOT IN (
    SELECT tablename.id FROM (
        SELECT MIN(date) as dateCol, name FROM tablename GROUP BY name /*select the minimum date and name, for each name*/
    ) as MyInnerQuery 
    INNER JOIN tablename on MyInnerQuery.dateCol = tablename.date 
        and MyInnerQuery.name = tablename.name /*select the id joined on the minimum date and the name*/
) /*Delete everything which isn't in the list of ids which are the minimum date fore each name*/

答案 3 :(得分:1)

喜欢马特,但没有加入:

DELETE FROM `table` WHERE `id` NOT IN (
    SELECT `id` FROM (
        SELECT `id` FROM `table` GROUP BY `name` ORDER BY `date`
    ) as A 
)

如果没有第一个SELECT,您将获得“您无法在FROM子句中为更新指定目标表'表'”

答案 4 :(得分:0)

DELETE t
FROM tableX AS t
  LEFT JOIN
    ( SELECT name
           , MIN(date) AS first_date
      FROM tableX
      GROUP BY name
    ) AS grp
    ON  grp.name = t.name
    AND grp.first_date = t.date
WHERE
    grp.name IS NULL

答案 5 :(得分:0)

DELETE FROM thetable tt
WHERE EXISTS (
    SELECT *
    FROM thetable tx
    WHERE tx.thename = tt.thename
    AND tx.thedate > tt. thedate
    );

(请注意,“date”是SQL中的保留字(类型),“和”在某些SQL实现中名称是保留字)