删除早于另一个具有相同ID的表中的行的行

时间:2019-06-11 10:50:49

标签: mysql sql

我有两个表,比如X和Y,它们具有相同的结构。

X:

<!DOCTYPE html>
<html lang="en">

<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
</head>

<body>
  <nav class="navbar fixed-top navbar-expand navbar-light bg-light navbar-default" role="navigation">
    <div id="navbar-collapse-1" class="collapse navbar-collapse">
      <ul class="nav navbar-nav">
        <li class="dropdown orange-bg">
          <a href="#">Foo</a>
        </li>
      </ul>
    </div>
  </nav>
</body>

</html>

Y:

+----------+----+-------+
| date     | id | value |
+----------+----+-------+
| 1.1.2019 | 1  | 1     |
| 1.1.2019 | 2  | 1     |
| 1.3.2019 | 3  | 1     |
+----------+----+-------+

我想从表X中删除所有ID与表Y中相同的ID,但日期较旧的行,因此所需的输出应如下所示:

+----------+----+-------+
| date     | id | value |
+----------+----+-------+
| 1.2.2019 | 1  | 1     |
| 1.3.2019 | 2  | 1     |
+----------+----+-------+

可悲的是,我的代码均无效:/

2 个答案:

答案 0 :(得分:1)

您可以在join中使用delete

delete x
    from x join
         y
         on x.id = y.id and x.date < y.date;

如果您只想选择这样的行(我认为这样更安全):

select x.*
from x join
     y
     on x.id = y.id and x.date < y.date;

上面的方法非常明智地假设date是作为日期/时间格式而不是字符串存储的。

如果“日期”列存储为字符串,则应修复数据。首先,将格式转换为系统上的默认格式:

update x
    set x.date = str_to_date(x.date, <whatever the format is here>);

日期格式不明确-我不知道哪一天是几月。

然后将列转换为日期:

alter table t
    modify column date date;

答案 1 :(得分:0)

您可以使用左联接来过滤表X并删除行。

DELETE X
FROM x X
LEFT JOIN y Y ON X.id = Y.id
WHERE Y.id IS NOT NULL
    AND Y.DATE > X.DATE